@quadrel-enterprise-ui/browser-check 1.0.0 → 18.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3175 @@
1
+ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.browserCheck = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2
+ (function (Buffer){(function (){
3
+ const UserAgentParser = require('ua-parser-js');
4
+
5
+ const DEFAULTS = {
6
+ HeadlessChrome: 57,
7
+ 'Chrome Headless': 57,
8
+ Chrome: 57,
9
+ Edge: 80,
10
+ Safari: 10,
11
+ 'Mobile Safari': 10,
12
+ Firefox: 50,
13
+ IE: false
14
+ };
15
+
16
+ module.exports = function (options) {
17
+ // Load main when DOM ready.
18
+ const oldOnload = window.onload;
19
+
20
+ if (typeof window.onload !== 'function') {
21
+ window.onload = main;
22
+ } else {
23
+ window.onload = function () {
24
+ if (oldOnload) {
25
+ oldOnload();
26
+ }
27
+ main(options);
28
+ };
29
+ }
30
+ };
31
+
32
+ function main(options) {
33
+ const ErrorPageHtml = Buffer("PHN0eWxlPgogIEBpbXBvcnQgdXJsKCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2NzczI/ZmFtaWx5PVJvYm90bzp3Z2h0QDQwMDs3MDAmZGlzcGxheT1zd2FwIik7CgogIC5xZC1mdWxsc2NyZWVuLWluZm8gewogICAgYmFja2dyb3VuZDogcmdiKDIzNywgMjM3LCAyMzcpOwogICAgaGVpZ2h0OiAxMDAlOwogICAgbGVmdDogMDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICB3aWR0aDogMTAwJTsKICAgIHotaW5kZXg6IDEwMDAwOwogIH0KCiAgI3FkLWVycm9yLXBhZ2Utd3JhcHBlciB7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogMTAwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWhlYWRlciB7CiAgICBiYWNrZ3JvdW5kOiByZ2IoMjU1LCAyNTUsIDI1NSk7CiAgICBib3JkZXItYm90dG9tOiA1cHggc29saWQgcmdiKDIyMCwgMCwgMjQpOwogICAgaGVpZ2h0OiAxMDVweDsKICAgIGxlZnQ6IDBweDsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMHB4OwogICAgd2lkdGg6IDEwMCU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1sb2dvIHsKICAgIGhlaWdodDogMTA1cHg7CiAgICB3aWR0aDogYXV0bzsKICAgIHBhZGRpbmc6IDIwcHg7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50LXdyYXBwZXIgewogICAgZGlzcGxheTogdGFibGU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBtYXJnaW46IDAgYXV0bzsKICAgIHBhZGRpbmc6IDEwNXB4IDAgNDBweCAwOwogICAgd2lkdGg6IDUwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWNvbnRlbnQgewogICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgewogICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMjU1LCAyNTUpOwogICAgYm90dG9tOiAwcHg7CiAgICBoZWlnaHQ6IDQwcHg7CiAgICBsZWZ0OiAwcHg7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB3aWR0aDogMTAwJTsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBzcGFuIHsKICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlJvYm90byIsIHNhbnMtc2VyaWY7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgdWwgewogICAgY29sb3I6IHJnYigwLCAxMDIsIDE1Myk7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBsaW5lLWhlaWdodDogNDBweDsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICByaWdodDogMDsKICAgIHRvcDogMDsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBsaSB7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBtYXJnaW4tcmlnaHQ6IDMwcHg7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYSB7CiAgICBjb2xvcjogcmdiKDAsIDEwMiwgMTUzKTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGZvbnQtZmFtaWx5OiAiUm9ib3RvIiwgc2Fucy1zZXJpZjsKICB9CgogICNxZC1lcnJvci1wYWdlLWZvb3RlciBhOmhvdmVyLAogICNxZC1lcnJvci1wYWdlLWZvb3RlciBhOmFjdGl2ZSwKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYTpmb2N1cywKICAjcWQtZXJyb3ItcGFnZS1mb290ZXIgYTp2aXNpdGVkIHsKICAgIGNvbG9yOiByZ2IoMCwgMTAyLCAxNTMpOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1pY29uIHsKICAgIGhlaWdodDogMTAycHg7CiAgICBtYXJnaW4tYm90dG9tOiA2MHB4OwogICAgd2lkdGg6IDExNXB4OwogIH0KCiAgI3FkLWVycm9yLXBhZ2UtY29udGVudCBoMSwKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50IGgzIHsKICAgIGNvbG9yOiByZ2IoMjMsIDIzLCAyMyk7CiAgICBmb250LWZhbWlseTogIlJvYm90byIsIHNhbnMtc2VyaWY7CiAgfQoKICAjcWQtZXJyb3ItcGFnZS1jb250ZW50IGgxIHsKICAgIGZvbnQtc2l6ZTogNTZweDsKICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICBtYXJnaW46IDM4cHggMDsKICB9CgogICNxZC1lcnJvci1wYWdlLWNvbnRlbnQgaDMgewogICAgZm9udC1zaXplOiAyOHB4OwogICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgIHBhZGRpbmctYm90dG9tOiAzMHB4OwogICAgbWFyZ2luOiAyOHB4IDA7CiAgfQo8L3N0eWxlPgo8ZGl2IGlkPSJxZC1lcnJvci1wYWdlLXdyYXBwZXIiPgogIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtaGVhZGVyIj4KICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFkbWluLmNoL2dvdi9kZS9zdGFydC5odG1sIj4KICAgICAgPHN2ZwogICAgICAgIGlkPSJxZC1lcnJvci1wYWdlLWxvZ28iCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICAgICAgIHZlcnNpb249IjEuMSIKICAgICAgICB4PSIwcHgiCiAgICAgICAgeT0iMHB4IgogICAgICAgIHZpZXdCb3g9IjguNTEyIDAgMTU1Ljk5IDM4LjM0NyIKICAgICAgICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDguNTEyIDAgMTU1Ljk5IDM4LjM0NyIKICAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICA+CiAgICAgICAgPGc+CiAgICAgICAgICA8Zz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMzguNDI2LDYuNTM4YzAuMzA5LDAuMTk1LDAuNjY3LDAuMzA4LDEuMTU1LDAuMzA4YzAuNjQ2LDAsMS4xNzgtMC4zMywxLjE3OC0xLjA3M2MwLTEuMDI4LTIuNC0xLjE1Ni0yLjQtMi41MjkgICAgYzAtMC44NCwwLjczNC0xLjM2NiwxLjY1OS0xLjM2NmMwLjI1NSwwLDAuNjY3LDAuMDM4LDEuMDI3LDAuMTcybC0wLjA4MywwLjQ3M2MtMC4yMzEtMC4xMjgtMC42MDEtMC4xOTUtMC45NTMtMC4xOTUgICAgYy0wLjU0LDAtMS4xMzMsMC4yMjUtMS4xMzMsMC45YzAsMS4wNTEsMi40MDEsMS4wNTgsMi40MDEsMi41ODljMCwxLjA1OC0wLjkwOCwxLjQ3OC0xLjcxOCwxLjQ3OCAgICBjLTAuNTExLDAtMC45MDgtMC4xMDUtMS4xODctMC4yMjVMMzguNDI2LDYuNTM4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDUuMzQ0LDMuODg4Yy0wLjI1NS0wLjExMi0wLjU2My0wLjE5NS0wLjgxNy0wLjE5NWMtMC45MjMsMC0xLjQ0MSwwLjY2OC0xLjQ0MSwxLjU5OGMwLDAuODcxLDAuNTI1LDEuNTk5LDEuMzg4LDEuNTk5ICAgIGMwLjMwMSwwLDAuNTc4LTAuMDY4LDAuODYzLTAuMTczbDAuMDQ1LDAuNDQzYy0wLjMyMiwwLjExMi0wLjYyMywwLjEzNS0wLjk4MiwwLjEzNWMtMS4yMzEsMC0xLjgzMS0wLjkzOC0xLjgzMS0yLjAwMyAgICBjMC0xLjE3OCwwLjc1OC0yLjAwMywxLjg5MS0yLjAwM2MwLjQ1OCwwLDAuNzg4LDAuMTA1LDAuOTIzLDAuMTVMNDUuMzQ0LDMuODg4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDYuNzcsMS41NzdoMC40NzN2Mi40NDZoMC4wMTVjMC4yMDMtMC40MiwwLjYzLTAuNzM1LDEuMTkzLTAuNzM1YzEuMDI4LDAsMS4zMDYsMC42ODMsMS4zMDYsMS42Mjh2Mi4yODloLTAuNDczVjQuOTI0ICAgIGMwLTAuNjYtMC4xMjctMS4yMy0wLjkwOC0xLjIzYy0wLjg0LDAtMS4xMzMsMC43OTUtMS4xMzMsMS40NjN2Mi4wNDhINDYuNzdWMS41Nzd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik01NS40Niw3LjIwNmgtMC41N2wtMS4wNDMtMy4zMDloLTAuMDE1bC0xLjA0MywzLjMwOWgtMC41N2wtMS4yMjktMy44MjdoMC41MThsMS4wMDUsMy4zMWgwLjAxNmwxLjA2NC0zLjMxaDAuNTcgICAgbDEuMDEzLDMuMzFoMC4wMTZsMS4wNTgtMy4zMWgwLjQ3M0w1NS40Niw3LjIwNnoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYwLjUxNyw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OSwwLjIxLTEuMTExLDAuMjFjLTEuMjY5LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIyLDAuODcxLDEuNTIyLDEuODk4djAuMjRoLTIuNjE4YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw2MC41MTcsNy4wODUgICAgTDYwLjUxNyw3LjA4NXogTTYwLjI4NCw1LjAyMmMwLTAuNjY4LTAuMjcxLTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDYwLjI4NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik02Mi43NiwyLjM1OGgtMC40NzN2LTAuNjNoMC40NzNWMi4zNTh6IE02Mi4yODgsMy4zNzhoMC40NzN2My44MjdoLTAuNDczVjMuMzc4eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTY0LjE4Nyw2LjgwOGwyLjMwNC0zLjAyNGgtMi4yMTRWMy4zNzloMi43NjF2MC40MDVsLTIuMzAzLDMuMDE3aDIuMzAzdjAuNDA1aC0yLjg1MVY2LjgwOHoiIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTcxLjAyMiw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OSwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIyLDAuODcxLDEuNTIyLDEuODk4djAuMjRoLTIuNjE4YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw3MS4wMjIsNy4wODUgICAgTDcxLjAyMiw3LjA4NXogTTcwLjc4OSw1LjAyMmMwLTAuNjY4LTAuMjctMS4zMjgtMC45NzUtMS4zMjhjLTAuNjk4LDAtMS4xMjYsMC42OTgtMS4xMjYsMS4zMjhINzAuNzg5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNzIuNzkzLDQuMjM0YzAtMC40MiwwLTAuNTc4LTAuMDMtMC44NTVoMC40NzR2MC43MzVoMC4wMTVjMC4xNzMtMC40MjcsMC40OTYtMC44MjUsMC45ODMtMC44MjUgICAgYzAuMTExLDAsMC4yNDgsMC4wMjIsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTktMC4wMy0wLjIyNi0wLjA0NS0wLjM0Ni0wLjA0NWMtMC43NSwwLTAuOTUyLDAuODQxLTAuOTUyLDEuNTMxdjEuODkxaC0wLjQ3NFY0LjIzNHogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aCBkPSJNNzYuMzUsMi4zNThoLTAuNDc0di0wLjYzaDAuNDc0VjIuMzU4eiBNNzUuODc3LDMuMzc4aDAuNDc0djMuODI3aC0wLjQ3NFYzLjM3OHoiIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTc3LjgzNiw2LjY1YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4M2MwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzNMNzkuOTksMy44NzVjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMNzcuODM2LDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC4xMjMsMy44ODhjLTAuMjU1LTAuMTEyLTAuNTYzLTAuMTk1LTAuODE4LTAuMTk1Yy0wLjkyMywwLTEuNDQsMC42NjgtMS40NCwxLjU5OGMwLDAuODcxLDAuNTI0LDEuNTk5LDEuMzg4LDEuNTk5ICAgIGMwLjMsMCwwLjU3OC0wLjA2OCwwLjg2My0wLjE3M0w4NC4xNiw3LjE2Yy0wLjMyMywwLjExMi0wLjYyMywwLjEzNS0wLjk4MywwLjEzNWMtMS4yMywwLTEuODMxLTAuOTM4LTEuODMxLTIuMDAzICAgIGMwLTEuMTc4LDAuNzU5LTIuMDAzLDEuODkyLTIuMDAzYzAuNDU4LDAsMC43ODgsMC4xMDUsMC45MjMsMC4xNUw4NC4xMjMsMy44ODh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NS41NDksMS41NzdoMC40NzR2Mi40NDZoMC4wMTVjMC4yMDMtMC40MiwwLjYzLTAuNzM1LDEuMTkzLTAuNzM1YzEuMDI3LDAsMS4zMDYsMC42ODMsMS4zMDYsMS42Mjh2Mi4yODloLTAuNDczVjQuOTI0ICAgIGMwLTAuNjYtMC4xMjctMS4yMy0wLjkwOC0xLjIzYy0wLjgzOSwwLTEuMTMyLDAuNzk1LTEuMTMyLDEuNDYzdjIuMDQ4aC0wLjQ3NFYxLjU3N3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTkyLjg3Miw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDMsMS4wNzMtMC4yODVMOTIuODcyLDcuMDg1ICAgIEw5Mi44NzIsNy4wODV6IE05Mi42MzksNS4wMjJjMC0wLjY2OC0wLjI3LTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDkyLjYzOXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik05Ny4xNDIsMS45NjdoMi41NjV2MC40NWgtMi4wNDh2MS44NjloMS45NDN2MC40NWgtMS45NDN2Mi4wMTloMi4xMzl2MC40NWgtMi42NTZWMS45Njd6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTAxLjksMi4zNThoLTAuNDc0di0wLjYzaDAuNDc0VjIuMzU4eiBNMTAxLjQyNiwzLjM3OGgwLjQ3NHYzLjgyN2gtMC40NzRWMy4zNzh6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMDYuNzA5LDcuMjA2aC0wLjQ3M1Y2LjU5N2gtMC4wMTZjLTAuMjU1LDAuNDg4LTAuNjQ2LDAuNjk4LTEuMTkyLDAuNjk4Yy0xLjA1LDAtMS41NzYtMC44Ny0xLjU3Ni0yLjAwMyAgICBjMC0xLjE2MywwLjQ1LTIuMDAzLDEuNTc2LTIuMDAzYzAuNzUsMCwxLjEyNSwwLjU0OCwxLjE5MiwwLjczNWgwLjAxNlYxLjU3OWgwLjQ3M1Y3LjIwNnogTTEwNS4xMDQsNi44OSAgICBjMC44NCwwLDEuMTMzLTAuOTAxLDEuMTMzLTEuNTk5YzAtMC42OTgtMC4yOTItMS41OTgtMS4xMzMtMS41OThjLTAuOSwwLTEuMTM0LDAuODU1LTEuMTM0LDEuNTk4ICAgIEMxMDMuOTY5LDYuMDM1LDEwNC4yMDIsNi44OSwxMDUuMTA0LDYuODl6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTEuNDY2LDYuODljMCwxLjA2NS0wLjQ3OSwxLjkzNi0xLjc5MywxLjkzNmMtMC41MDMsMC0wLjk2LTAuMTQzLTEuMTU1LTAuMjAzbDAuMDM3LTAuNDczICAgIGMwLjI5MiwwLjE1LDAuNzE0LDAuMjcxLDEuMTI1LDAuMjcxYzEuMjE3LDAsMS4zMjEtMC44ODYsMS4zMjEtMS45NjZoLTAuMDE1Yy0wLjI1NSwwLjU1NS0wLjY3NSwwLjc1LTEuMTYzLDAuNzUgICAgYy0xLjIyMywwLTEuNjEzLTEuMDY1LTEuNjEzLTEuOTE0YzAtMS4xNjMsMC40NS0yLjAwMywxLjU3Ni0yLjAwM2MwLjUxLDAsMC44NCwwLjA2NywxLjE5MywwLjUyNWgwLjAxNVYzLjM3N2gwLjQ3M0wxMTEuNDY2LDYuODkgICAgTDExMS40NjYsNi44OXogTTEwOS44Myw2LjhjMC44NTUsMCwxLjE2My0wLjgxMSwxLjE2My0xLjUwOGMwLTAuOTIzLTAuMjctMS41OTgtMS4xMzMtMS41OThjLTAuOSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEMxMDguNzI4LDYuMDQyLDEwOS4wMjgsNi44LDEwOS44Myw2Ljh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTUuNzU4LDcuMDg1Yy0wLjMzLDAuMTM1LTAuNzU4LDAuMjEtMS4xMSwwLjIxYy0xLjI2OSwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMiwwLjg3MSwxLjUyMiwxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYyLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDMsMS4wNzItMC4yODVMMTE1Ljc1OCw3LjA4NSAgICBMMTE1Ljc1OCw3LjA4NXogTTExNS41MjYsNS4wMjJjMC0wLjY2OC0wLjI3MS0xLjMyOC0wLjk3Ni0xLjMyOGMtMC42OTcsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEgxMTUuNTI2eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTE3LjUzLDQuMjc5YzAtMC4yOTMsMC0wLjU5My0wLjAzLTAuOTAxaDAuNDU4djAuNjgzaDAuMDE1YzAuMTU3LTAuMzQ1LDAuNDQyLTAuNzczLDEuMjM4LTAuNzczICAgIGMwLjk0NiwwLDEuMzA3LDAuNjMsMS4zMDcsMS40NzF2Mi40NDZoLTAuNDc0VjQuODc5YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNiAgICBoLTAuNDczVjQuMjc5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIzLjc4LDMuMjg5YzEuMjM4LDAsMS43ODYsMC45NiwxLjc4NiwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODYsMi4wMDNzLTEuNzg2LTAuOTYtMS43ODYtMi4wMDMgICAgUzEyMi41NDIsMy4yODksMTIzLjc4LDMuMjg5eiBNMTIzLjc4LDYuODljMC44MjYsMCwxLjI2OC0wLjcxMywxLjI2OC0xLjU5OWMwLTAuODg1LTAuNDQxLTEuNTk4LTEuMjY4LTEuNTk4ICAgIGMtMC44MjUsMC0xLjI2OSwwLjcxMy0xLjI2OSwxLjU5OEMxMjIuNTExLDYuMTc3LDEyMi45NTQsNi44OSwxMjMuNzgsNi44OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEyNi43NTEsNi42NWMwLjI4NSwwLjE0MywwLjYzLDAuMjQsMC45OTgsMC4yNGMwLjQ1LDAsMC44NDgtMC4yNDgsMC44NDgtMC42ODNjMC0wLjkwOC0xLjgzOC0wLjc2NS0xLjgzOC0xLjg3NiAgICBjMC0wLjc1OCwwLjYxNS0xLjA0MywxLjI0Ni0xLjA0M2MwLjIwMywwLDAuNjA4LDAuMDQ1LDAuOTQ1LDAuMTczbC0wLjA0NSwwLjQxM2MtMC4yNDgtMC4xMTMtMC41ODUtMC4xOC0wLjg0OC0wLjE4ICAgIGMtMC40ODgsMC0wLjgyNiwwLjE1LTAuODI2LDAuNjM4YzAsMC43MTMsMS44ODQsMC42MjMsMS44ODQsMS44NzZjMCwwLjgxMS0wLjc1OCwxLjA4OC0xLjMzNiwxLjA4OCAgICBjLTAuMzY4LDAtMC43MzUtMC4wNDUtMS4wNzMtMC4xOEwxMjYuNzUxLDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMzAuMjU1LDYuNjVjMC4yODUsMC4xNDMsMC42MywwLjI0LDAuOTk4LDAuMjRjMC40NSwwLDAuODQ5LTAuMjQ4LDAuODQ5LTAuNjgzYzAtMC45MDgtMS44MzktMC43NjUtMS44MzktMS44NzYgICAgYzAtMC43NTgsMC42MTUtMS4wNDMsMS4yNDYtMS4wNDNjMC4yMDMsMCwwLjYwOCwwLjA0NSwwLjk0NSwwLjE3M2wtMC4wNDUsMC40MTNjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODg0LDAuNjIzLDEuODg0LDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzYsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMMTMwLjI1NSw2LjY1eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTM2LjYxOCw3LjA4NWMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDMsMS4wNzMtMC4yODVMMTM2LjYxOCw3LjA4NSAgICBMMTM2LjYxOCw3LjA4NXogTTEzNi4zODUsNS4wMjJjMC0wLjY2OC0wLjI3LTEuMzI4LTAuOTc1LTEuMzI4Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI4SDEzNi4zODV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMzguMzg5LDQuMjc5YzAtMC4yOTMsMC0wLjU5My0wLjAyOS0wLjkwMWgwLjQ1OHYwLjY4M2gwLjAxNWMwLjE1Ny0wLjM0NSwwLjQ0Mi0wLjc3MywxLjIzOC0wLjc3MyAgICBjMC45NDYsMCwxLjMwNiwwLjYzLDEuMzA2LDEuNDcxdjIuNDQ2aC0wLjQ3M1Y0Ljg3OWMwLTAuNzItMC4yNTUtMS4xODYtMC45MDgtMS4xODZjLTAuODYzLDAtMS4xMzMsMC43NTgtMS4xMzMsMS4zOTZ2Mi4xMTYgICAgaC0wLjQ3NFY0LjI3OUwxMzguMzg5LDQuMjc5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTQyLjg1NSw2LjY1YzAuMjg0LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDQ5LDAsMC44NDgtMC4yNDgsMC44NDgtMC42ODNjMC0wLjkwOC0xLjgzOC0wLjc2NS0xLjgzOC0xLjg3NiAgICBjMC0wLjc1OCwwLjYxNS0xLjA0MywxLjI0Ni0xLjA0M2MwLjIwMywwLDAuNjA3LDAuMDQ1LDAuOTQ0LDAuMTczbC0wLjA0NSwwLjQxM2MtMC4yNDgtMC4xMTMtMC41ODUtMC4xOC0wLjg0OC0wLjE4ICAgIGMtMC40ODgsMC0wLjgyNiwwLjE1LTAuODI2LDAuNjM4YzAsMC43MTMsMS44ODQsMC42MjMsMS44ODQsMS44NzZjMCwwLjgxMS0wLjc1OCwxLjA4OC0xLjMzNiwxLjA4OCAgICBjLTAuMzY3LDAtMC43MzQtMC4wNDUtMS4wNzItMC4xOEwxNDIuODU1LDYuNjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNDkuMTQzLDMuODg4Yy0wLjI1Ni0wLjExMi0wLjU2My0wLjE5NS0wLjgxOC0wLjE5NWMtMC45MjMsMC0xLjQ0MSwwLjY2OC0xLjQ0MSwxLjU5OGMwLDAuODcxLDAuNTI1LDEuNTk5LDEuMzg5LDEuNTk5ICAgIGMwLjMsMCwwLjU3OC0wLjA2OCwwLjg2Mi0wLjE3M2wwLjA0NSwwLjQ0M2MtMC4zMjIsMC4xMTItMC42MjIsMC4xMzUtMC45ODIsMC4xMzVjLTEuMjMxLDAtMS44MzEtMC45MzgtMS44MzEtMi4wMDMgICAgYzAtMS4xNzgsMC43NTgtMi4wMDMsMS44OTEtMi4wMDNjMC40NTgsMCwwLjc4OCwwLjEwNSwwLjkyMywwLjE1TDE0OS4xNDMsMy44ODh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNTAuNTY4LDEuNTc3aDAuNDczdjIuNDQ2aDAuMDE1YzAuMjAzLTAuNDIsMC42MzEtMC43MzUsMS4xOTMtMC43MzVjMS4wMjgsMCwxLjMwNiwwLjY4MywxLjMwNiwxLjYyOHYyLjI4OWgtMC40NzMgICAgVjQuOTI0YzAtMC42Ni0wLjEyOC0xLjIzLTAuOTA4LTEuMjNjLTAuODQsMC0xLjEzMywwLjc5NS0xLjEzMywxLjQ2M3YyLjA0OGgtMC40NzNWMS41NzdMMTUwLjU2OCwxLjU3N3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTE1Ny41MjQsNi41OWgtMC4wMTZjLTAuMjEsMC40NTgtMC43NDIsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzUtMS4yNjEtMS4wODEgICAgYzAtMS4yODMsMS4zNjYtMS4zNDMsMi4zNTUtMS4zNDNoMC4wOTFWNC42NzZjMC0wLjY1My0wLjIzMi0wLjk4My0wLjg3LTAuOTgzYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjYsMC4zMTVWMy41NSAgICBjMC4yOTMtMC4xNDMsMC43ODgtMC4yNjMsMS4xMjYtMC4yNjNjMC45NDQsMCwxLjM0MywwLjQyOCwxLjM0MywxLjQyNnYxLjY4OWMwLDAuMzA4LDAsMC41NCwwLjAzOCwwLjgwM2gtMC40NjZMMTU3LjUyNCw2LjU5ICAgIEwxNTcuNTI0LDYuNTl6IE0xNTcuNDc5LDUuMjc3aC0wLjEzNmMtMC44MTcsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzU5LDAuNjksMC43OTUsMC42OSAgICBjMS4xMSwwLDEuMTM0LTAuOTY4LDEuMTM0LTEuMzgxVjUuMjc3eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTU5Ljk4NSwzLjc4M2gtMC43NzJWMy4zNzhoMC43NzJWMy4xMDFjMC0wLjgwMywwLjAyOS0xLjYxMywxLjAxNC0xLjYxM2MwLjE0OSwwLDAuMzU0LDAuMDIyLDAuNDQyLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDYsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA1aC0wLjg2M3YzLjQyMmgtMC40NzNWMy43ODN6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xNjQuMzk3LDMuNzgzaC0wLjg3VjYuMjZjMCwwLjM0NSwwLjEyOCwwLjYzLDAuNTExLDAuNjNjMC4xOCwwLDAuMy0wLjAzOCwwLjQzNS0wLjA5bDAuMDMsMC4zOSAgICBjLTAuMTExLDAuMDQ1LTAuMzQ1LDAuMTA1LTAuNTc4LDAuMTA1Yy0wLjg0LDAtMC44Ny0wLjU3OC0wLjg3LTEuMjc1VjMuNzg0aC0wLjc1VjMuMzc5aDAuNzVWMi40NTdsMC40NzQtMC4xNjV2MS4wODhoMC44NyAgICBMMTY0LjM5NywzLjc4M0wxNjQuMzk3LDMuNzgzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNDIuMTAzLDEyLjkwM2MtMC4zMy0wLjE3Mi0wLjgwNC0wLjIyNS0xLjE3MS0wLjIyNWMtMS4zNTgsMC0yLjEyNCwwLjk2LTIuMTI0LDIuMjU5YzAsMS4zMiwwLjc0MiwyLjI1OCwyLjEyNCwyLjI1OCAgICBjMC4zNDUsMCwwLjg3LTAuMDQ1LDEuMTcxLTAuMjI1bDAuMDI5LDAuNDVjLTAuMjg1LDAuMTczLTAuODcsMC4yMjUtMS4yLDAuMjI1Yy0xLjY1MSwwLTIuNjQyLTEuMDg4LTIuNjQyLTIuNzA4ICAgIGMwLTEuNTkxLDEuMDIxLTIuNzA5LDIuNjQyLTIuNzA5YzAuMzA4LDAsMC45MzEsMC4wNTMsMS4yLDAuMTk1TDQyLjEwMywxMi45MDN6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00NS4zNTIsMTMuNjM4YzEuMjM3LDAsMS43ODUsMC45NiwxLjc4NSwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODUsMi4wMDNjLTEuMjM4LDAtMS43ODYtMC45Ni0xLjc4Ni0yLjAwMyAgICBTNDQuMTE0LDEzLjYzOCw0NS4zNTIsMTMuNjM4eiBNNDUuMzUyLDE3LjI0YzAuODI1LDAsMS4yNjgtMC43MTMsMS4yNjgtMS41OTljMC0wLjg4NS0wLjQ0Mi0xLjU5OC0xLjI2OC0xLjU5OCAgICBzLTEuMjY5LDAuNzEzLTEuMjY5LDEuNTk4QzQ0LjA4NCwxNi41MjcsNDQuNTI3LDE3LjI0LDQ1LjM1MiwxNy4yNHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwxNC42MjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45MDFoMC40NTh2MC42ODNoMC4wMTZjMC4xNTYtMC4zNDUsMC40NDEtMC43NzMsMS4yMzctMC43NzMgICAgYzAuOTQ2LDAsMS4zMDcsMC42MywxLjMwNywxLjQ3MXYyLjQ0Nkg1MS4xM3YtMi4zMjZjMC0wLjcyLTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE2ICAgIGgtMC40NzNWMTQuNjI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTMuNjk2LDE0LjEzM2gtMC43NzN2LTAuNDA1aDAuNzczdi0wLjI3N2MwLTAuODAzLDAuMDMtMS42MTMsMS4wMTMtMS42MTNjMC4xNSwwLDAuMzU0LDAuMDIyLDAuNDQzLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDUsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA1aC0wLjg2M3YzLjQyMmgtMC40NzNWMTQuMTMzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTkuMDI0LDE3LjQzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NDEtMC44NTUtMS43NDEtMi4wMDNjMC0xLjE3LDAuNjQ2LTIuMDAzLDEuNjEzLTIuMDAzICAgIGMxLjA4MSwwLDEuNTIzLDAuODcxLDEuNTIzLDEuODk4djAuMjRoLTIuNjE5YzAsMC44MTEsMC40MzYsMS40NjMsMS4yNjEsMS40NjNjMC4zNDUsMCwwLjg0OC0wLjE0MywxLjA3My0wLjI4NUw1OS4wMjQsMTcuNDM2ICAgIEw1OS4wMjQsMTcuNDM2eiBNNTguNzkxLDE1LjM3M2MwLTAuNjY4LTAuMjctMS4zMjgtMC45NzUtMS4zMjhjLTAuNjk4LDAtMS4xMjYsMC42OTgtMS4xMjYsMS4zMjhINTguNzkxeiBNNTguMDA0LDEyLjI1aDAuNTkzICAgIGwtMC45NDQsMS4wODFoLTAuMzQ1TDU4LjAwNCwxMi4yNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYzLjgyNiwxNy41NTVoLTAuNDczdi0wLjYwOGgtMC4wMTZjLTAuMjU1LDAuNDg4LTAuNjQ2LDAuNjk4LTEuMTkyLDAuNjk4Yy0xLjA1MSwwLTEuNTc2LTAuODctMS41NzYtMi4wMDMgICAgYzAtMS4xNjMsMC40NS0yLjAwMywxLjU3Ni0yLjAwM2MwLjc1LDAsMS4xMjUsMC41NDgsMS4xOTIsMC43MzVoMC4wMTZ2LTIuNDQ2aDAuNDczVjE3LjU1NXogTTYyLjIxOSwxNy4yNCAgICBjMC44NDEsMCwxLjEzNC0wLjkwMSwxLjEzNC0xLjU5OWMwLTAuNjk4LTAuMjkyLTEuNTk4LTEuMTM0LTEuNTk4Yy0wLjg5OSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEM2MS4wODcsMTYuMzg1LDYxLjMyLDE3LjI0LDYyLjIxOSwxNy4yNHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY4LjExOCwxNy40MzZjLTAuMzMsMC4xMzUtMC43NTgsMC4yMS0xLjExMSwwLjIxYy0xLjI2OCwwLTEuNzQtMC44NTUtMS43NC0yLjAwM2MwLTEuMTcsMC42NDYtMi4wMDMsMS42MTItMi4wMDMgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ5LTAuMTQzLDEuMDczLTAuMjg1TDY4LjExOCwxNy40MzYgICAgTDY4LjExOCwxNy40MzZ6IE02Ny44ODUsMTUuMzczYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg2Ny44ODV6IE02Ny4wOTcsMTIuMjVoMC41OTQgICAgbC0wLjk0NiwxLjA4MUg2Ni40TDY3LjA5NywxMi4yNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY5Ljg4OCwxNC41ODRjMC0wLjQyLDAtMC41NzgtMC4wMjktMC44NTVoMC40NzN2MC43MzZoMC4wMTVjMC4xNzQtMC40MjgsMC40OTYtMC44MjYsMC45ODMtMC44MjYgICAgYzAuMTEyLDAsMC4yNDgsMC4wMjIsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTgtMC4wMy0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQtMC45NTMsMS41MzF2MS44OTFoLTAuNDc0VjE0LjU4NHogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik03NS4xNzIsMTYuOTRoLTAuMDE1Yy0wLjIxLDAuNDU4LTAuNzQzLDAuNzA1LTEuMjE2LDAuNzA1Yy0xLjA4OCwwLTEuMjYxLTAuNzM1LTEuMjYxLTEuMDgxICAgIGMwLTEuMjgzLDEuMzY2LTEuMzQzLDIuMzU2LTEuMzQzaDAuMDl2LTAuMTk1YzAtMC42NTMtMC4yMzItMC45ODMtMC44NzEtMC45ODNjLTAuMzk3LDAtMC43NzIsMC4wOS0xLjEyNSwwLjMxNVYxMy45ICAgIGMwLjI5Mi0wLjE0MywwLjc4OC0wLjI2MywxLjEyNS0wLjI2M2MwLjk0NSwwLDEuMzQ0LDAuNDI4LDEuMzQ0LDEuNDI2djEuNjg4YzAsMC4zMDgsMCwwLjU0LDAuMDM3LDAuODAzaC0wLjQ2NVYxNi45NHogICAgIE03NS4xMjcsMTUuNjI3aC0wLjEzNWMtMC44MTgsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzYsMC42OSwwLjc5NSwwLjY5YzEuMTEsMCwxLjEzMy0wLjk2OCwxLjEzMy0xLjM4MVYxNS42Mjd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik03OC45NjEsMTQuMTMzSDc4LjA5djIuNDc3YzAsMC4zNDUsMC4xMjgsMC42MywwLjUxMSwwLjYzYzAuMTgsMCwwLjMtMC4wMzgsMC40MzYtMC4wOWwwLjAzLDAuMzkgICAgYy0wLjExMiwwLjA0NS0wLjM0NiwwLjEwNS0wLjU3OCwwLjEwNWMtMC44NCwwLTAuODcxLTAuNTc4LTAuODcxLTEuMjc1di0yLjIzNmgtMC43NXYtMC40MDVoMC43NXYtMC45MjNsMC40NzMtMC4xNjV2MS4wODhoMC44NzEgICAgVjE0LjEzM3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik04MC44NjcsMTIuNzA4aC0wLjQ3M3YtMC42M2gwLjQ3M1YxMi43MDh6IE04MC4zOTQsMTMuNzI5aDAuNDczdjMuODI3aC0wLjQ3M1YxMy43Mjl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC4xMzcsMTMuNjM4YzEuMjM4LDAsMS43ODYsMC45NiwxLjc4NiwyLjAwM3MtMC41NDgsMi4wMDMtMS43ODYsMi4wMDNjLTEuMjM3LDAtMS43ODUtMC45Ni0xLjc4NS0yLjAwMyAgICBTODIuOSwxMy42MzgsODQuMTM3LDEzLjYzOHogTTg0LjEzNywxNy4yNGMwLjgyNiwwLDEuMjY5LTAuNzEzLDEuMjY5LTEuNTk5YzAtMC44ODUtMC40NDItMS41OTgtMS4yNjktMS41OTggICAgYy0wLjgyNCwwLTEuMjY4LDAuNzEzLTEuMjY4LDEuNTk4QzgyLjg3LDE2LjUyNyw4My4zMTMsMTcuMjQsODQuMTM3LDE3LjI0eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNODcuNDAyLDE0LjYyOWMwLTAuMjkzLDAtMC41OTMtMC4wMy0wLjkwMWgwLjQ1OHYwLjY4M2gwLjAxNWMwLjE1Ny0wLjM0NSwwLjQ0Mi0wLjc3MywxLjIzOC0wLjc3MyAgICBjMC45NDYsMCwxLjMwNiwwLjYzLDEuMzA2LDEuNDcxdjIuNDQ2aC0wLjQ3M3YtMi4zMjZjMC0wLjcyLTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE2ICAgIGgtMC40NzNWMTQuNjI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNOTQuNDYzLDE3YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4M2MwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzJsLTAuMDQ1LDAuNDEzYy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4LTAuODQ4LTAuMTggICAgYy0wLjQ4OCwwLTAuODI2LDAuMTUtMC44MjYsMC42MzhjMCwwLjcxMywxLjg4NCwwLjYyMywxLjg4NCwxLjg3NmMwLDAuODExLTAuNzU4LDEuMDg4LTEuMzM2LDEuMDg4ICAgIGMtMC4zNjgsMC0wLjczNS0wLjA0NS0xLjA3My0wLjE4TDk0LjQ2MywxN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEwMS4yNDYsMTYuNjU1YzAsMC4yOTIsMCwwLjU5MywwLjAzLDAuOWgtMC40NTh2LTAuNjgzaC0wLjAxNmMtMC4xNTcsMC4zNDUtMC40NDIsMC43NzItMS4yMzcsMC43NzIgICAgYy0wLjk0NSwwLTEuMzA3LTAuNjMtMS4zMDctMS40NzF2LTIuNDQ2aDAuNDc0djIuMzI2YzAsMC43MjEsMC4yNTUsMS4xODYsMC45MDgsMS4xODZjMC44NjIsMCwxLjEzMy0wLjc1OCwxLjEzMy0xLjM5NnYtMi4xMTYgICAgaDAuNDczVjE2LjY1NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDMuNDksMTIuNzA4aC0wLjQ3M3YtMC42M2gwLjQ3M1YxMi43MDh6IE0xMDMuMDE4LDEzLjcyOWgwLjQ3M3YzLjgyN2gtMC40NzNWMTMuNzI5eiIgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTA0Ljk3NiwxN2MwLjI4NCwwLjE0MywwLjYzLDAuMjQsMC45OTgsMC4yNGMwLjQ0OSwwLDAuODQ4LTAuMjQ4LDAuODQ4LTAuNjgzYzAtMC45MDgtMS44MzgtMC43NjUtMS44MzgtMS44NzYgICAgYzAtMC43NTgsMC42MTUtMS4wNDMsMS4yNDYtMS4wNDNjMC4yMDMsMCwwLjYwNywwLjA0NSwwLjk0NCwwLjE3MmwtMC4wNDUsMC40MTNjLTAuMjQ4LTAuMTEzLTAuNTg1LTAuMTgtMC44NDgtMC4xOCAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc2YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM0LTAuMDQ1LTEuMDczLTAuMThMMTA0Ljk3NiwxN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTEwOC40ODEsMTdjMC4yODUsMC4xNDMsMC42MywwLjI0LDAuOTk4LDAuMjRjMC40NDksMCwwLjg0OC0wLjI0OCwwLjg0OC0wLjY4M2MwLTAuOTA4LTEuODM4LTAuNzY1LTEuODM4LTEuODc2ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDcsMC4wNDUsMC45NDQsMC4xNzJsLTAuMDQ1LDAuNDEzYy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4LTAuODQ4LTAuMTggICAgYy0wLjQ4OCwwLTAuODI2LDAuMTUtMC44MjYsMC42MzhjMCwwLjcxMywxLjg4NCwwLjYyMywxLjg4NCwxLjg3NmMwLDAuODExLTAuNzU4LDEuMDg4LTEuMzM2LDEuMDg4ICAgIGMtMC4zNjcsMC0wLjczNC0wLjA0NS0xLjA3Mi0wLjE4TDEwOC40ODEsMTd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMTQuODQyLDE3LjQzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIxLTEuMTEsMC4yMWMtMS4yNjksMC0xLjc0MS0wLjg1NS0xLjc0MS0yLjAwM2MwLTEuMTcsMC42NDYtMi4wMDMsMS42MTMtMi4wMDMgICAgYzEuMDgxLDAsMS41MjIsMC44NzEsMS41MjIsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNywxLjQ2MywxLjI2MiwxLjQ2M2MwLjM0NSwwLDAuODQ4LTAuMTQzLDEuMDcyLTAuMjg1TDExNC44NDIsMTcuNDM2ICAgIEwxMTQuODQyLDE3LjQzNnogTTExNC42MSwxNS4zNzNjMC0wLjY2OC0wLjI3MS0xLjMyOC0wLjk3Ni0xLjMyOGMtMC42OTcsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEgxMTQuNjF6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00Mi4xMDMsMjMuMjUzYy0wLjMzLTAuMTcyLTAuODA0LTAuMjI1LTEuMTcxLTAuMjI1Yy0xLjM1OCwwLTIuMTI0LDAuOTYtMi4xMjQsMi4yNmMwLDEuMzE5LDAuNzQyLDIuMjU4LDIuMTI0LDIuMjU4ICAgIGMwLjM0NSwwLDAuODctMC4wNDUsMS4xNzEtMC4yMjZsMC4wMjksMC40NWMtMC4yODUsMC4xNzMtMC44NywwLjIyNS0xLjIsMC4yMjVjLTEuNjUxLDAtMi42NDItMS4wODgtMi42NDItMi43MDcgICAgYzAtMS41OTIsMS4wMjEtMi43MDksMi42NDItMi43MDljMC4zMDgsMCwwLjkzMSwwLjA1MSwxLjIsMC4xOTRMNDIuMTAzLDIzLjI1M3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ1LjM1MiwyMy45ODhjMS4yMzcsMCwxLjc4NSwwLjk2LDEuNzg1LDIuMDAzcy0wLjU0OCwyLjAwMy0xLjc4NSwyLjAwM2MtMS4yMzgsMC0xLjc4Ni0wLjk2LTEuNzg2LTIuMDAzICAgIFM0NC4xMTQsMjMuOTg4LDQ1LjM1MiwyMy45ODh6IE00NS4zNTIsMjcuNTkxYzAuODI1LDAsMS4yNjgtMC43MTMsMS4yNjgtMS42YzAtMC44ODUtMC40NDItMS41OTgtMS4yNjgtMS41OTggICAgcy0xLjI2OSwwLjcxMy0xLjI2OSwxLjU5OEM0NC4wODQsMjYuODc4LDQ0LjUyNywyNy41OTEsNDUuMzUyLDI3LjU5MXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwyNC45NzljMC0wLjI5MywwLTAuNTk0LTAuMDMtMC45aDAuNDU4djAuNjgyaDAuMDE2YzAuMTU2LTAuMzQ0LDAuNDQxLTAuNzcyLDEuMjM3LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA3LDAuNjMsMS4zMDcsMS40NzJ2Mi40NDVINTEuMTN2LTIuMzI2YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjI0Ljk3OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTUzLjY5NiwyNC40ODRoLTAuNzczdi0wLjQwNWgwLjc3M3YtMC4yNzdjMC0wLjgwMywwLjAzLTEuNjEyLDEuMDEzLTEuNjEyYzAuMTUsMCwwLjM1NCwwLjAyMiwwLjQ0MywwLjA3NWwtMC4wMywwLjQxMiAgICBjLTAuMDk4LTAuMDUzLTAuMjQtMC4wODItMC4zNzUtMC4wODJjLTAuNjQ1LDAtMC41NzgsMC42OTctMC41NzgsMS4xNTR2MC4zM2gwLjg2M3YwLjQwNWgtMC44NjN2My40MjJoLTAuNDczVjI0LjQ4NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTU5LjAyNCwyNy43ODVjLTAuMzMsMC4xMzYtMC43NTgsMC4yMS0xLjExMSwwLjIxYy0xLjI2OCwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDQsMS4wNzMtMC4yODVMNTkuMDI0LDI3Ljc4NSAgICBMNTkuMDI0LDI3Ljc4NXogTTU4Ljc5MSwyNS43MjJjMC0wLjY2OC0wLjI3LTEuMzI3LTAuOTc1LTEuMzI3Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI3SDU4Ljc5MXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTYzLjgyNiwyNy45MDVoLTAuNDczdi0wLjYwN2gtMC4wMTZjLTAuMjU1LDAuNDg3LTAuNjQ2LDAuNjk3LTEuMTkyLDAuNjk3Yy0xLjA1MSwwLTEuNTc2LTAuODY5LTEuNTc2LTIuMDAzICAgIGMwLTEuMTYzLDAuNDUtMi4wMDMsMS41NzYtMi4wMDNjMC43NSwwLDEuMTI1LDAuNTQ5LDEuMTkyLDAuNzM0aDAuMDE2di0yLjQ0NWgwLjQ3M1YyNy45MDV6IE02Mi4yMTksMjcuNTkxICAgIGMwLjg0MSwwLDEuMTM0LTAuOTAxLDEuMTM0LTEuNmMwLTAuNjk3LTAuMjkyLTEuNTk4LTEuMTM0LTEuNTk4Yy0wLjg5OSwwLTEuMTMzLDAuODU1LTEuMTMzLDEuNTk4ICAgIEM2MS4wODcsMjYuNzM1LDYxLjMyLDI3LjU5MSw2Mi4yMTksMjcuNTkxeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNjguMTE4LDI3Ljc4NWMtMC4zMywwLjEzNi0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDktMC4xNDQsMS4wNzMtMC4yODVMNjguMTE4LDI3Ljc4NSAgICBMNjguMTE4LDI3Ljc4NXogTTY3Ljg4NSwyNS43MjJjMC0wLjY2OC0wLjI3LTEuMzI3LTAuOTc1LTEuMzI3Yy0wLjY5OCwwLTEuMTI2LDAuNjk4LTEuMTI2LDEuMzI3SDY3Ljg4NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTY5Ljg4OCwyNC45MzVjMC0wLjQyLDAtMC41NzgtMC4wMjktMC44NTVoMC40NzN2MC43MzVoMC4wMTVjMC4xNzQtMC40MjcsMC40OTYtMC44MjUsMC45ODMtMC44MjUgICAgYzAuMTEyLDAsMC4yNDgsMC4wMjEsMC4zMywwLjA0NXYwLjQ5NmMtMC4wOTgtMC4wMjktMC4yMjUtMC4wNDUtMC4zNDUtMC4wNDVjLTAuNzUsMC0wLjk1MywwLjg0MS0wLjk1MywxLjUzMXYxLjg5MWgtMC40NzQgICAgVjI0LjkzNXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTc1LjE3MiwyNy4yOWgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzQtMS4yNjEtMS4wOCAgICBjMC0xLjI4MywxLjM2Ni0xLjM0NCwyLjM1Ni0xLjM0NGgwLjA5di0wLjE5NWMwLTAuNjUyLTAuMjMyLTAuOTgyLTAuODcxLTAuOTgyYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjUsMC4zMTR2LTAuNDU3ICAgIGMwLjI5Mi0wLjE0NCwwLjc4OC0wLjI2NCwxLjEyNS0wLjI2NGMwLjk0NSwwLDEuMzQ0LDAuNDI4LDEuMzQ0LDEuNDI2djEuNjg4YzAsMC4zMDksMCwwLjU0MSwwLjAzNywwLjgwNGgtMC40NjVWMjcuMjl6ICAgICBNNzUuMTI3LDI1Ljk3OGgtMC4xMzVjLTAuODE4LDAtMS43OTMsMC4wODMtMS43OTMsMC45MjNjMCwwLjUwMiwwLjM2LDAuNjksMC43OTUsMC42OWMxLjExLDAsMS4xMzMtMC45NjksMS4xMzMtMS4zODFWMjUuOTc4eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTc2Ljk1OCwyNy41MDlsMi4zMDQtMy4wMjRoLTIuMjE0di0wLjQwNWgyLjc2MnYwLjQwNWwtMi4zMDQsMy4wMTdoMi4zMDR2MC40MDVoLTIuODUyVjI3LjUwOXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik04MS43LDIzLjA1OGgtMC40NzN2LTAuNjI5SDgxLjdWMjMuMDU4eiBNODEuMjI3LDI0LjA3OUg4MS43djMuODI2aC0wLjQ3M1YyNC4wNzl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04NC45NywyMy45ODhjMS4yMzgsMCwxLjc4NiwwLjk2LDEuNzg2LDIuMDAzcy0wLjU0OCwyLjAwMy0xLjc4NiwyLjAwM2MtMS4yMzcsMC0xLjc4NS0wLjk2LTEuNzg1LTIuMDAzICAgIFM4My43MzQsMjMuOTg4LDg0Ljk3LDIzLjk4OHogTTg0Ljk3LDI3LjU5MWMwLjgyNiwwLDEuMjY5LTAuNzEzLDEuMjY5LTEuNmMwLTAuODg1LTAuNDQyLTEuNTk4LTEuMjY5LTEuNTk4ICAgIGMtMC44MjQsMC0xLjI2OCwwLjcxMy0xLjI2OCwxLjU5OEM4My43MDMsMjYuODc4LDg0LjE0NiwyNy41OTEsODQuOTcsMjcuNTkxeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNODguMjM1LDI0Ljk3OWMwLTAuMjkzLDAtMC41OTQtMC4wMy0wLjloMC40NTh2MC42ODJoMC4wMTVjMC4xNTctMC4zNDQsMC40NDItMC43NzIsMS4yMzgtMC43NzIgICAgYzAuOTQ2LDAsMS4zMDYsMC42MywxLjMwNiwxLjQ3MnYyLjQ0NWgtMC40NzN2LTIuMzI2YzAtMC43Mi0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjI0Ljk3OXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTk1LjU1OSwyNy43ODVjLTAuMzMsMC4xMzYtMC43NTksMC4yMS0xLjExMSwwLjIxYy0xLjI2OSwwLTEuNzQxLTAuODU1LTEuNzQxLTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMy0yLjAwMyAgICBjMS4wODEsMCwxLjUyMiwwLjg3MSwxLjUyMiwxLjg5OHYwLjI0aC0yLjYxOGMwLDAuODExLDAuNDM2LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ1LDAsMC44NDgtMC4xNDQsMS4wNzMtMC4yODVMOTUuNTU5LDI3Ljc4NSAgICBMOTUuNTU5LDI3Ljc4NXogTTk1LjMyNSwyNS43MjJjMC0wLjY2OC0wLjI3MS0xLjMyNy0wLjk3NS0xLjMyN2MtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyN0g5NS4zMjV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik05OS44MzYsMjcuMjM3YzAuMzA5LDAuMTk1LDAuNjY3LDAuMzA5LDEuMTU1LDAuMzA5YzAuNjQ2LDAsMS4xNzgtMC4zMywxLjE3OC0xLjA3NGMwLTEuMDI3LTIuNC0xLjE1NS0yLjQtMi41MjggICAgYzAtMC44NCwwLjczNC0xLjM2NiwxLjY1OC0xLjM2NmMwLjI1NiwwLDAuNjY3LDAuMDM4LDEuMDI4LDAuMTcybC0wLjA4MywwLjQ3M2MtMC4yMzEtMC4xMjctMC42MDEtMC4xOTQtMC45NTMtMC4xOTQgICAgYy0wLjU0LDAtMS4xMzMsMC4yMjYtMS4xMzMsMC44OTljMCwxLjA1MiwyLjQwMSwxLjA1OSwyLjQwMSwyLjU5YzAsMS4wNTgtMC45MDgsMS40NzgtMS43MTksMS40NzggICAgYy0wLjUxLDAtMC45MDctMC4xMDQtMS4xODYtMC4yMjVMOTkuODM2LDI3LjIzN3oiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDUuNTksMjcuOTA1aC0wLjU1NWwtMS4yOTgtMy44MjZoMC41MThsMS4wNTksMy4zMDloMC4wMTVsMS4xMTEtMy4zMDloMC40OTVMMTA1LjU5LDI3LjkwNXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDguNjUzLDIzLjA1OGgtMC40NzR2LTAuNjI5aDAuNDc0VjIzLjA1OHogTTEwOC4xNzksMjQuMDc5aDAuNDc0djMuODI2aC0wLjQ3NFYyNC4wNzl6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTEwLjA3OCwyNy41MDlsMi4zMDQtMy4wMjRoLTIuMjE0di0wLjQwNWgyLjc2MXYwLjQwNWwtMi4zMDMsMy4wMTdoMi4zMDN2MC40MDVoLTIuODUxVjI3LjUwOXoiIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMTMuOTk1LDI3LjUwOWwyLjMwNC0zLjAyNGgtMi4yMTR2LTAuNDA1aDIuNzYxdjAuNDA1bC0yLjMwMywzLjAxN2gyLjMwM3YwLjQwNWgtMi44NTFWMjcuNTA5eiIgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIwLjgzLDI3Ljc4NWMtMC4zMywwLjEzNi0wLjc1OCwwLjIxLTEuMTExLDAuMjFjLTEuMjY4LDAtMS43NC0wLjg1NS0xLjc0LTIuMDAzYzAtMS4xNywwLjY0Ni0yLjAwMywxLjYxMi0yLjAwMyAgICBjMS4wODEsMCwxLjUyMywwLjg3MSwxLjUyMywxLjg5OHYwLjI0aC0yLjYxOWMwLDAuODExLDAuNDM3LDEuNDYzLDEuMjYxLDEuNDYzYzAuMzQ2LDAsMC44NDktMC4xNDQsMS4wNzMtMC4yODVMMTIwLjgzLDI3Ljc4NSAgICBMMTIwLjgzLDI3Ljc4NXogTTEyMC41OTcsMjUuNzIyYzAtMC42NjgtMC4yNy0xLjMyNy0wLjk3NS0xLjMyN2MtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyN0gxMjAuNTk3eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTIyLjYwMiwyNC45MzVjMC0wLjQyLDAtMC41NzgtMC4wMy0wLjg1NWgwLjQ3M3YwLjczNWgwLjAxNmMwLjE3My0wLjQyNywwLjQ5NS0wLjgyNSwwLjk4Mi0wLjgyNSAgICBjMC4xMTIsMCwwLjI0OCwwLjAyMSwwLjMzLDAuMDQ1djAuNDk2Yy0wLjA5OC0wLjAyOS0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQxLTAuOTUzLDEuNTMxdjEuODkxaC0wLjQ3MyAgICBWMjQuOTM1eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNMTI3Ljg4NCwyNy4yOWgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNi0wLjczNC0xLjI2LTEuMDggICAgYzAtMS4yODMsMS4zNjUtMS4zNDQsMi4zNTUtMS4zNDRoMC4wOXYtMC4xOTVjMC0wLjY1Mi0wLjIzMi0wLjk4Mi0wLjg3MS0wLjk4MmMtMC4zOTcsMC0wLjc3MiwwLjA5LTEuMTI1LDAuMzE0di0wLjQ1NyAgICBjMC4yOTItMC4xNDQsMC43ODgtMC4yNjQsMS4xMjUtMC4yNjRjMC45NDUsMCwxLjM0NCwwLjQyOCwxLjM0NCwxLjQyNnYxLjY4OGMwLDAuMzA5LDAsMC41NDEsMC4wMzgsMC44MDRoLTAuNDY2VjI3LjI5eiAgICAgTTEyNy44MzksMjUuOTc4aC0wLjEzNWMtMC44MTgsMC0xLjc5MywwLjA4My0xLjc5MywwLjkyM2MwLDAuNTAyLDAuMzYsMC42OSwwLjc5NSwwLjY5YzEuMTEsMCwxLjEzMy0wLjk2OSwxLjEzMy0xLjM4MVYyNS45Nzh6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00Mi4xMDMsMzMuNjA0Yy0wLjMzLTAuMTczLTAuODA0LTAuMjI2LTEuMTcxLTAuMjI2Yy0xLjM1OCwwLTIuMTI0LDAuOTYxLTIuMTI0LDIuMjZjMCwxLjMyLDAuNzQyLDIuMjU4LDIuMTI0LDIuMjU4ICAgIGMwLjM0NSwwLDAuODctMC4wNDUsMS4xNzEtMC4yMjVsMC4wMjksMC40NDljLTAuMjg1LDAuMTc0LTAuODcsMC4yMjUtMS4yLDAuMjI1Yy0xLjY1MSwwLTIuNjQyLTEuMDg4LTIuNjQyLTIuNzA3ICAgIGMwLTEuNTkyLDEuMDIxLTIuNzA5LDIuNjQyLTIuNzA5YzAuMzA4LDAsMC45MzEsMC4wNTIsMS4yLDAuMTk1TDQyLjEwMywzMy42MDR6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik00NS4zNTIsMzQuMzM5YzEuMjM3LDAsMS43ODUsMC45NTksMS43ODUsMi4wMDJzLTAuNTQ4LDIuMDA0LTEuNzg1LDIuMDA0Yy0xLjIzOCwwLTEuNzg2LTAuOTYxLTEuNzg2LTIuMDA0ICAgIFM0NC4xMTQsMzQuMzM5LDQ1LjM1MiwzNC4zMzl6IE00NS4zNTIsMzcuOTRjMC44MjUsMCwxLjI2OC0wLjcxMywxLjI2OC0xLjZjMC0wLjg4NS0wLjQ0Mi0xLjU5OC0xLjI2OC0xLjU5OCAgICBzLTEuMjY5LDAuNzEzLTEuMjY5LDEuNTk4QzQ0LjA4NCwzNy4yMjgsNDQuNTI3LDM3Ljk0LDQ1LjM1MiwzNy45NHoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTQ4LjYxNiwzNS4zMjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45aDAuNDU4djAuNjgzaDAuMDE2YzAuMTU2LTAuMzQ1LDAuNDQxLTAuNzcyLDEuMjM3LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA3LDAuNjI5LDEuMzA3LDEuNDcxdjIuNDQ1SDUxLjEzdi0yLjMyNmMwLTAuNzE5LTAuMjU1LTEuMTg2LTAuOTA4LTEuMTg2Yy0wLjg2MiwwLTEuMTMzLDAuNzU4LTEuMTMzLDEuMzk2djIuMTE1ICAgIGgtMC40NzNWMzUuMzI5eiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTMuNjk2LDM0LjgzM2gtMC43NzN2LTAuNDA0aDAuNzczdi0wLjI3N2MwLTAuODAzLDAuMDMtMS42MTMsMS4wMTMtMS42MTNjMC4xNSwwLDAuMzU0LDAuMDIyLDAuNDQzLDAuMDc1bC0wLjAzLDAuNDEzICAgIGMtMC4wOTgtMC4wNTMtMC4yNC0wLjA4My0wLjM3NS0wLjA4M2MtMC42NDUsMC0wLjU3OCwwLjY5OC0wLjU3OCwxLjE1NXYwLjMzaDAuODYzdjAuNDA0aC0wLjg2M3YzLjQyMmgtMC40NzNWMzQuODMzeiIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNTkuMDI0LDM4LjEzNmMtMC4zMywwLjEzNS0wLjc1OCwwLjIwOS0xLjExMSwwLjIwOWMtMS4yNjgsMC0xLjc0MS0wLjg1NC0xLjc0MS0yLjAwMmMwLTEuMTcsMC42NDYtMi4wMDQsMS42MTMtMi4wMDQgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ4LTAuMTQzLDEuMDczLTAuMjg1TDU5LjAyNCwzOC4xMzYgICAgTDU5LjAyNCwzOC4xMzZ6IE01OC43OTEsMzYuMDcxYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg1OC43OTF6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02My44MjYsMzguMjU1aC0wLjQ3M3YtMC42MDdoLTAuMDE2Yy0wLjI1NSwwLjQ4OC0wLjY0NiwwLjY5Ny0xLjE5MiwwLjY5N2MtMS4wNTEsMC0xLjU3Ni0wLjg2OS0xLjU3Ni0yLjAwMiAgICBjMC0xLjE2NCwwLjQ1LTIuMDA0LDEuNTc2LTIuMDA0YzAuNzUsMCwxLjEyNSwwLjU0OSwxLjE5MiwwLjczNWgwLjAxNnYtMi40NDZoMC40NzNWMzguMjU1eiBNNjIuMjE5LDM3Ljk0ICAgIGMwLjg0MSwwLDEuMTM0LTAuOSwxLjEzNC0xLjZjMC0wLjY5Ny0wLjI5Mi0xLjU5OC0xLjEzNC0xLjU5OGMtMC44OTksMC0xLjEzMywwLjg1NS0xLjEzMywxLjU5OCAgICBDNjEuMDg3LDM3LjA4NSw2MS4zMiwzNy45NCw2Mi4yMTksMzcuOTR6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02OC4xMTgsMzguMTM2Yy0wLjMzLDAuMTM1LTAuNzU4LDAuMjA5LTEuMTExLDAuMjA5Yy0xLjI2OCwwLTEuNzQtMC44NTQtMS43NC0yLjAwMmMwLTEuMTcsMC42NDYtMi4wMDQsMS42MTItMi4wMDQgICAgYzEuMDgxLDAsMS41MjMsMC44NzEsMS41MjMsMS44OTh2MC4yNGgtMi42MTljMCwwLjgxMSwwLjQzNiwxLjQ2MywxLjI2MSwxLjQ2M2MwLjM0NSwwLDAuODQ5LTAuMTQzLDEuMDczLTAuMjg1TDY4LjExOCwzOC4xMzYgICAgTDY4LjExOCwzOC4xMzZ6IE02Ny44ODUsMzYuMDcxYzAtMC42NjgtMC4yNy0xLjMyOC0wLjk3NS0xLjMyOGMtMC42OTgsMC0xLjEyNiwwLjY5OC0xLjEyNiwxLjMyOEg2Ny44ODV6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik02OS44ODgsMzUuMjgzYzAtMC40MiwwLTAuNTc3LTAuMDI5LTAuODU0aDAuNDczdjAuNzM0aDAuMDE1YzAuMTc0LTAuNDI3LDAuNDk2LTAuODI0LDAuOTgzLTAuODI0ICAgIGMwLjExMiwwLDAuMjQ4LDAuMDIxLDAuMzMsMC4wNDV2MC40OTZjLTAuMDk4LTAuMDMxLTAuMjI1LTAuMDQ1LTAuMzQ1LTAuMDQ1Yy0wLjc1LDAtMC45NTMsMC44NC0wLjk1MywxLjUzdjEuODkyaC0wLjQ3NFYzNS4yODN6ICAgICIKICAgICAgICAgICAgLz4KICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICBkPSJNNzUuMTcyLDM3LjY0aC0wLjAxNWMtMC4yMSwwLjQ1OS0wLjc0MywwLjcwNS0xLjIxNiwwLjcwNWMtMS4wODgsMC0xLjI2MS0wLjczNC0xLjI2MS0xLjA4ICAgIGMwLTEuMjgzLDEuMzY2LTEuMzQ0LDIuMzU2LTEuMzQ0aDAuMDl2LTAuMTk1YzAtMC42NTItMC4yMzItMC45ODItMC44NzEtMC45ODJjLTAuMzk3LDAtMC43NzIsMC4wOS0xLjEyNSwwLjMxNHYtMC40NTcgICAgYzAuMjkyLTAuMTQzLDAuNzg4LTAuMjY0LDEuMTI1LTAuMjY0YzAuOTQ1LDAsMS4zNDQsMC40MjgsMS4zNDQsMS40MjZ2MS42ODhjMCwwLjMwOCwwLDAuNTQsMC4wMzcsMC44MDRoLTAuNDY1VjM3LjY0eiAgICAgTTc1LjEyNywzNi4zMjZoLTAuMTM1Yy0wLjgxOCwwLTEuNzkzLDAuMDgzLTEuNzkzLDAuOTIzYzAsMC41MDIsMC4zNiwwLjY5LDAuNzk1LDAuNjljMS4xMSwwLDEuMTMzLTAuOTY4LDEuMTMzLTEuMzgyVjM2LjMyNnoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik03Ni45NTgsMzcuODU4bDIuMzA0LTMuMDIzaC0yLjIxNHYtMC40MDZoMi43NjJ2MC40MDZsLTIuMzA0LDMuMDE2aDIuMzA0djAuNDA2aC0yLjg1MlYzNy44NTh6IiAvPgogICAgICAgICAgICA8cGF0aCBkPSJNODEuNywzMy40MDdoLTAuNDczdi0wLjYzSDgxLjdWMzMuNDA3eiBNODEuMjI3LDM0LjQyOUg4MS43djMuODI2aC0wLjQ3M1YzNC40Mjl6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik04Ni40NjQsMzcuMzU1YzAsMC4yOTIsMCwwLjU5MywwLjAzLDAuODk5aC0wLjQ1OHYtMC42ODNoLTAuMDE0Yy0wLjE1OCwwLjM0NS0wLjQ0MywwLjc3Mi0xLjIzOCwwLjc3MiAgICBjLTAuOTQ1LDAtMS4zMDYtMC42MzEtMS4zMDYtMS40NzF2LTIuNDQ3aDAuNDczdjIuMzI2YzAsMC43MjEsMC4yNTUsMS4xODcsMC45MDgsMS4xODdjMC44NjIsMCwxLjEzMy0wLjc1OSwxLjEzMy0xLjM5NnYtMi4xMTcgICAgaDAuNDczTDg2LjQ2NCwzNy4zNTVMODYuNDY0LDM3LjM1NXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTg4LjIzNSwzNS4zMjljMC0wLjI5MywwLTAuNTkzLTAuMDMtMC45aDAuNDU4djAuNjgzaDAuMDE1YzAuMTU3LTAuMzQ1LDAuNDQyLTAuNzcyLDEuMjM4LTAuNzcyICAgIGMwLjk0NiwwLDEuMzA2LDAuNjI5LDEuMzA2LDEuNDcxdjIuNDQ1aC0wLjQ3M3YtMi4zMjZjMC0wLjcxOS0wLjI1NS0xLjE4Ni0wLjkwOC0xLjE4NmMtMC44NjIsMC0xLjEzMywwLjc1OC0xLjEzMywxLjM5NnYyLjExNSAgICBoLTAuNDczVjM1LjMyOXoiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTk1LjI5NSwzNy43YzAuMjg1LDAuMTQzLDAuNjMsMC4yNCwwLjk5OCwwLjI0YzAuNDUsMCwwLjg0OS0wLjI0OCwwLjg0OS0wLjY4NGMwLTAuOTA4LTEuODM5LTAuNzY1LTEuODM5LTEuODc1ICAgIGMwLTAuNzU4LDAuNjE1LTEuMDQzLDEuMjQ2LTEuMDQzYzAuMjAzLDAsMC42MDgsMC4wNDUsMC45NDUsMC4xNzJsLTAuMDQ1LDAuNDE0Yy0wLjI0OC0wLjExMy0wLjU4NS0wLjE4MS0wLjg0OC0wLjE4MSAgICBjLTAuNDg4LDAtMC44MjYsMC4xNS0wLjgyNiwwLjYzOGMwLDAuNzEzLDEuODgzLDAuNjIzLDEuODgzLDEuODc3YzAsMC44MTEtMC43NTgsMS4wODgtMS4zMzUsMS4wODggICAgYy0wLjM2OCwwLTAuNzM1LTAuMDQ1LTEuMDczLTAuMThMOTUuMjk1LDM3Ljd6IgogICAgICAgICAgICAvPgogICAgICAgICAgICA8cGF0aCBkPSJNMTAwLjQyLDM4LjI1NWgtMC41NTVsLTEuMjk4LTMuODI2aDAuNTE4bDEuMDU5LDMuMzFoMC4wMTVsMS4xMTEtMy4zMWgwLjQ5NEwxMDAuNDIsMzguMjU1eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTEwMy40ODMsMzMuNDA3aC0wLjQ3NHYtMC42M2gwLjQ3NFYzMy40MDd6IE0xMDMuMDA5LDM0LjQyOWgwLjQ3NHYzLjgyNmgtMC40NzRWMzQuNDI5eiIgLz4KICAgICAgICAgICAgPHBhdGggZD0iTTEwNC45MDgsMzcuODU4bDIuMzA0LTMuMDIzaC0yLjIxNHYtMC40MDZoMi43NjF2MC40MDZsLTIuMzAzLDMuMDE2aDIuMzAzdjAuNDA2aC0yLjg1MVYzNy44NTh6IiAvPgogICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgIGQ9Ik0xMDkuMTc3LDM1LjI4M2MwLTAuNDIsMC0wLjU3Ny0wLjAyOS0wLjg1NGgwLjQ3M3YwLjczNGgwLjAxNWMwLjE3NC0wLjQyNywwLjQ5Ni0wLjgyNCwwLjk4My0wLjgyNCAgICBjMC4xMTIsMCwwLjI0OCwwLjAyMSwwLjMzLDAuMDQ1djAuNDk2Yy0wLjA5OC0wLjAzMS0wLjIyNS0wLjA0NS0wLjM0NS0wLjA0NWMtMC43NSwwLTAuOTUzLDAuODQtMC45NTMsMS41M3YxLjg5MmgtMC40NzRWMzUuMjgzeiAgICAiCiAgICAgICAgICAgIC8+CiAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgZD0iTTExNC40NiwzNy42NGgtMC4wMTVjLTAuMjEsMC40NTktMC43NDMsMC43MDUtMS4yMTYsMC43MDVjLTEuMDg4LDAtMS4yNjEtMC43MzQtMS4yNjEtMS4wOCAgICBjMC0xLjI4MywxLjM2Ni0xLjM0NCwyLjM1Ni0xLjM0NGgwLjA5di0wLjE5NWMwLTAuNjUyLTAuMjMyLTAuOTgyLTAuODcxLTAuOTgyYy0wLjM5NywwLTAuNzcyLDAuMDktMS4xMjUsMC4zMTR2LTAuNDU3ICAgIGMwLjI5Mi0wLjE0MywwLjc4OC0wLjI2NCwxLjEyNS0wLjI2NGMwLjk0NSwwLDEuMzQzLDAuNDI4LDEuMzQzLDEuNDI2djEuNjg4YzAsMC4zMDgsMCwwLjU0LDAuMDM4LDAuODA0aC0wLjQ2NVYzNy42NHogICAgIE0xMTQuNDE1LDM2LjMyNmgtMC4xMzVjLTAuODE4LDAtMS43OTMsMC4wODMtMS43OTMsMC45MjNjMCwwLjUwMiwwLjM1OSwwLjY5LDAuNzk1LDAuNjljMS4xMSwwLDEuMTMzLTAuOTY4LDEuMTMzLTEuMzgyVjM2LjMyNnogICAgIgogICAgICAgICAgICAvPgogICAgICAgICAgPC9nPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgZmlsbD0iI0UzMDYxMyIKICAgICAgICAgICAgZD0iTTI5Ljc3OCwxLjczN2MwLDAtMy45NjktMS43MzgtMTAuNjEzLTEuNzM4aC0wLjAwMkMxMi41MTgsMCw4LjU0OSwxLjczNyw4LjU0OSwxLjczNyAgIFM4LjE5NCw5LjQzMyw5LjcsMTMuNzg1YzIuNjYxLDcuNjUxLDkuNDYyLDkuODAyLDkuNDYyLDkuODAyaDAuMDAyaDAuMDAyYzAsMCw2LjgtMi4xNDksOS40NjItOS44MDIgICBDMzAuMTM0LDkuNDM0LDI5Ljc3OCwxLjczNywyOS43NzgsMS43Mzd6IgogICAgICAgICAgLz4KICAgICAgICAgIDxwb2x5Z29uCiAgICAgICAgICAgIGZpbGw9IiNGRkZGRkYiCiAgICAgICAgICAgIHBvaW50cz0iMjYuMjE3LDguMzczIDI2LjIxNywxMi42MTIgMjEuMjcsMTIuNjEyIDIxLjI3LDE3LjU2MSAxNy4wMywxNy41NjEgMTcuMDMsMTIuNjEyIDEyLjA4MywxMi42MTIgICAgMTIuMDgzLDguMzczIDE3LjAzLDguMzczIDE3LjAzLDMuNDI2IDIxLjI2OSwzLjQyNiAyMS4yNyw4LjM3MyAgIgogICAgICAgICAgLz4KICAgICAgICA8L2c+CiAgICAgIDwvc3ZnPgogICAgPC9hPgogIDwvZGl2PgogIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtY29udGVudC13cmFwcGVyIj4KICAgIDxkaXYgaWQ9InFkLWVycm9yLXBhZ2UtY29udGVudCI+CiAgICAgIDxzdmcKICAgICAgICBpZD0icWQtZXJyb3ItcGFnZS1pY29uIgogICAgICAgIHZlcnNpb249IjEuMSIKICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgeD0iMHB4IgogICAgICAgIHk9IjBweCIKICAgICAgICB3aWR0aD0iNTc2cHgiCiAgICAgICAgaGVpZ2h0PSI1MTJweCIKICAgICAgICB2aWV3Qm94PSIwIDAgNTc2IDUxMiIKICAgICAgICBzdHlsZT0ib3ZlcmZsb3c6IHZpc2libGU7IGVuYWJsZS1iYWNrZ3JvdW5kOiBuZXcgMCAwIDU3NiA1MTIiCiAgICAgICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgICAgPgogICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgICAuc3QwIHsKICAgICAgICAgICAgZmlsbDogIzk3OTc5NzsKICAgICAgICAgIH0KICAgICAgICA8L3N0eWxlPgogICAgICAgIDxkZWZzPjwvZGVmcz4KICAgICAgICA8Zz4KICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgIGNsYXNzPSJzdDAiCiAgICAgICAgICAgIGQ9Ik01NjkuNSw0NDBMMzI5LjYsMjRjLTE4LjQtMzItNjQuNy0zMi04My4yLDBMNi41LDQ0MGMtMTguNCwzMS45LDQuNiw3Miw0MS42LDcySDUyOAogICAgICAgICAgICAgICAgQzU2NC44LDUxMiw1ODgsNDcyLDU2OS41LDQ0MHogTTI3MC4yLDE2MGgzNS41YzMuNCwwLDYuMSwyLjgsNiw2LjJsLTcuNSwxOTZjLTAuMSwzLjItMi44LDUuOC02LDUuOGgtMjAuNWMtMy4yLDAtNS45LTIuNS02LTUuOAogICAgICAgICAgICAgICAgbC03LjUtMTk2QzI2NC4xLDE2Mi44LDI2Ni44LDE2MCwyNzAuMiwxNjB6IE0yODgsNDQ0Yy0xNS41LDAtMjgtMTIuNS0yOC0yOHMxMi41LTI4LDI4LTI4czI4LDEyLjUsMjgsMjhTMzAzLjUsNDQ0LDI4OCw0NDR6IgogICAgICAgICAgLz4KICAgICAgICA8L2c+CiAgICAgIDwvc3ZnPgogICAgPC9kaXY+CiAgPC9kaXY+CiAgPGRpdiBpZD0icWQtZXJyb3ItcGFnZS1mb290ZXIiPgogICAgPHNwYW4+RWlkZ2Vuw7Zzc2lzY2hlIFpvbGx2ZXJ3YWx0dW5nPC9zcGFuPgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYWRtaW4uY2gvZ292L2RlL3N0YXJ0L2Rva3VtZW50YXRpb24vaW1wcmVzc3VtLmh0bWwiPkltcHJlc3N1bTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuYWRtaW4uY2gvZ292L2RlL3N0YXJ0L3JlY2h0bGljaGVzLmh0bWwiPlJlY2h0bGljaGVzPC9hPjwvbGk+CiAgICA8L3VsPgogIDwvZGl2Pgo8L2Rpdj4K","base64");
34
+
35
+ const errorContainer = document.createElement('div');
36
+ errorContainer.id = 'outdated';
37
+ document.body.appendChild(errorContainer);
38
+
39
+ // Despite the docs, UA needs to be provided to constructor explicitly:
40
+ // https://github.com/faisalman/ua-parser-js/issues/90
41
+ const parsedUserAgent = new UserAgentParser(window.navigator.userAgent).getResult();
42
+
43
+ // Set default options
44
+ const browserSupport = options ? updateDefaults(DEFAULTS, options) : DEFAULTS;
45
+
46
+ // Check if browser is supported
47
+ if (isBrowserOutOfDate(parsedUserAgent, browserSupport)) {
48
+ const errorText = {
49
+ en: {
50
+ headline: 'Your browser is not supported.',
51
+ subline:
52
+ 'We recommend using the latest version of Chrome (Google), Firefox (Mozilla), ' +
53
+ 'Edge (Microsoft) or Safari (Apple).'
54
+ },
55
+ de: {
56
+ headline: 'Ihr Browser wird nicht unterstützt.',
57
+ subline:
58
+ 'Wir empfehlen, die neuste Version von Chrome (Google), Firefox (Mozilla), ' +
59
+ 'Edge (Microsoft) oder Safari (Apple) zu verwenden.'
60
+ },
61
+ fr: {
62
+ headline: "Votre navigateur n'est pas pris en charge.",
63
+ subline:
64
+ "Nous vous recommandons d'utiliser la dernière version de Chrome (Google), " +
65
+ 'Firefox (Mozilla), Edge (Microsoft) ou Safari (Apple).'
66
+ },
67
+ it: {
68
+ headline: 'Il tuo browser non è supportato.',
69
+ subline:
70
+ "Si consiglia di utilizzare l'ultima versione di Chrome (Google), " +
71
+ 'Firefox (Mozilla), Edge (Microsoft) o Safari (Apple).'
72
+ }
73
+ };
74
+
75
+ const insertContentHere = document.getElementById('outdated');
76
+ insertContentHere.classList.add('qd-fullscreen-info');
77
+ insertContentHere.innerHTML = ErrorPageHtml;
78
+
79
+ const browserLanguageCode = (navigator.language || navigator.userLanguage).substring(0, 2).toLowerCase();
80
+
81
+ const headline = document.createElement('h1');
82
+ const subline = document.createElement('h3');
83
+ headline.innerHTML = errorText[getLanguageCode(browserLanguageCode)].headline;
84
+ subline.innerHTML = errorText[getLanguageCode(browserLanguageCode)].subline;
85
+ document.getElementById('qd-error-page-content').appendChild(headline);
86
+ document.getElementById('qd-error-page-content').appendChild(subline);
87
+ }
88
+ }
89
+
90
+ function updateDefaults(defaults, updatedValues) {
91
+ for (let key in updatedValues) {
92
+ defaults[key] = updatedValues[key];
93
+ }
94
+
95
+ return defaults;
96
+ }
97
+
98
+ function isBrowserOutOfDate(parsedUserAgent, browserSupport) {
99
+ const browserName = parsedUserAgent.browser.name;
100
+ const browserMajorVersion = parsedUserAgent.browser.major;
101
+
102
+ let isOutOfDate = false;
103
+ if (isBrowserUnsupported()) {
104
+ isOutOfDate = true;
105
+ }
106
+
107
+ if (browserName in browserSupport) {
108
+ const minVersion = browserSupport[browserName];
109
+
110
+ if (parseInt(browserMajorVersion) < parseInt(minVersion)) {
111
+ isOutOfDate = true;
112
+ }
113
+ }
114
+
115
+ return isOutOfDate;
116
+
117
+ function isBrowserUnsupported() {
118
+ const browserName = parsedUserAgent.browser.name;
119
+ let isUnsupported = false;
120
+ if (!(browserName in browserSupport)) {
121
+ isUnsupported = true;
122
+ } else if (!browserSupport[browserName]) {
123
+ isUnsupported = true;
124
+ }
125
+ return isUnsupported;
126
+ }
127
+ }
128
+
129
+ function getLanguageCode(browserLanguageCode) {
130
+ if (['en', 'de', 'fr', 'it'].indexOf(browserLanguageCode) === -1) {
131
+ return 'en';
132
+ }
133
+
134
+ return browserLanguageCode;
135
+ }
136
+
137
+
138
+ }).call(this)}).call(this,require("buffer").Buffer)
139
+
140
+ },{"buffer":3,"ua-parser-js":5}],2:[function(require,module,exports){
141
+ 'use strict'
142
+
143
+ exports.byteLength = byteLength
144
+ exports.toByteArray = toByteArray
145
+ exports.fromByteArray = fromByteArray
146
+
147
+ var lookup = []
148
+ var revLookup = []
149
+ var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
150
+
151
+ var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
152
+ for (var i = 0, len = code.length; i < len; ++i) {
153
+ lookup[i] = code[i]
154
+ revLookup[code.charCodeAt(i)] = i
155
+ }
156
+
157
+ // Support decoding URL-safe base64 strings, as Node.js does.
158
+ // See: https://en.wikipedia.org/wiki/Base64#URL_applications
159
+ revLookup['-'.charCodeAt(0)] = 62
160
+ revLookup['_'.charCodeAt(0)] = 63
161
+
162
+ function getLens (b64) {
163
+ var len = b64.length
164
+
165
+ if (len % 4 > 0) {
166
+ throw new Error('Invalid string. Length must be a multiple of 4')
167
+ }
168
+
169
+ // Trim off extra bytes after placeholder bytes are found
170
+ // See: https://github.com/beatgammit/base64-js/issues/42
171
+ var validLen = b64.indexOf('=')
172
+ if (validLen === -1) validLen = len
173
+
174
+ var placeHoldersLen = validLen === len
175
+ ? 0
176
+ : 4 - (validLen % 4)
177
+
178
+ return [validLen, placeHoldersLen]
179
+ }
180
+
181
+ // base64 is 4/3 + up to two characters of the original data
182
+ function byteLength (b64) {
183
+ var lens = getLens(b64)
184
+ var validLen = lens[0]
185
+ var placeHoldersLen = lens[1]
186
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
187
+ }
188
+
189
+ function _byteLength (b64, validLen, placeHoldersLen) {
190
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
191
+ }
192
+
193
+ function toByteArray (b64) {
194
+ var tmp
195
+ var lens = getLens(b64)
196
+ var validLen = lens[0]
197
+ var placeHoldersLen = lens[1]
198
+
199
+ var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
200
+
201
+ var curByte = 0
202
+
203
+ // if there are placeholders, only get up to the last complete 4 chars
204
+ var len = placeHoldersLen > 0
205
+ ? validLen - 4
206
+ : validLen
207
+
208
+ var i
209
+ for (i = 0; i < len; i += 4) {
210
+ tmp =
211
+ (revLookup[b64.charCodeAt(i)] << 18) |
212
+ (revLookup[b64.charCodeAt(i + 1)] << 12) |
213
+ (revLookup[b64.charCodeAt(i + 2)] << 6) |
214
+ revLookup[b64.charCodeAt(i + 3)]
215
+ arr[curByte++] = (tmp >> 16) & 0xFF
216
+ arr[curByte++] = (tmp >> 8) & 0xFF
217
+ arr[curByte++] = tmp & 0xFF
218
+ }
219
+
220
+ if (placeHoldersLen === 2) {
221
+ tmp =
222
+ (revLookup[b64.charCodeAt(i)] << 2) |
223
+ (revLookup[b64.charCodeAt(i + 1)] >> 4)
224
+ arr[curByte++] = tmp & 0xFF
225
+ }
226
+
227
+ if (placeHoldersLen === 1) {
228
+ tmp =
229
+ (revLookup[b64.charCodeAt(i)] << 10) |
230
+ (revLookup[b64.charCodeAt(i + 1)] << 4) |
231
+ (revLookup[b64.charCodeAt(i + 2)] >> 2)
232
+ arr[curByte++] = (tmp >> 8) & 0xFF
233
+ arr[curByte++] = tmp & 0xFF
234
+ }
235
+
236
+ return arr
237
+ }
238
+
239
+ function tripletToBase64 (num) {
240
+ return lookup[num >> 18 & 0x3F] +
241
+ lookup[num >> 12 & 0x3F] +
242
+ lookup[num >> 6 & 0x3F] +
243
+ lookup[num & 0x3F]
244
+ }
245
+
246
+ function encodeChunk (uint8, start, end) {
247
+ var tmp
248
+ var output = []
249
+ for (var i = start; i < end; i += 3) {
250
+ tmp =
251
+ ((uint8[i] << 16) & 0xFF0000) +
252
+ ((uint8[i + 1] << 8) & 0xFF00) +
253
+ (uint8[i + 2] & 0xFF)
254
+ output.push(tripletToBase64(tmp))
255
+ }
256
+ return output.join('')
257
+ }
258
+
259
+ function fromByteArray (uint8) {
260
+ var tmp
261
+ var len = uint8.length
262
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
263
+ var parts = []
264
+ var maxChunkLength = 16383 // must be multiple of 3
265
+
266
+ // go through the array every three bytes, we'll deal with trailing stuff later
267
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
268
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
269
+ }
270
+
271
+ // pad the end with zeros, but make sure to not forget the extra bytes
272
+ if (extraBytes === 1) {
273
+ tmp = uint8[len - 1]
274
+ parts.push(
275
+ lookup[tmp >> 2] +
276
+ lookup[(tmp << 4) & 0x3F] +
277
+ '=='
278
+ )
279
+ } else if (extraBytes === 2) {
280
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1]
281
+ parts.push(
282
+ lookup[tmp >> 10] +
283
+ lookup[(tmp >> 4) & 0x3F] +
284
+ lookup[(tmp << 2) & 0x3F] +
285
+ '='
286
+ )
287
+ }
288
+
289
+ return parts.join('')
290
+ }
291
+
292
+ },{}],3:[function(require,module,exports){
293
+ (function (Buffer){(function (){
294
+ /*!
295
+ * The buffer module from node.js, for the browser.
296
+ *
297
+ * @author Feross Aboukhadijeh <https://feross.org>
298
+ * @license MIT
299
+ */
300
+ /* eslint-disable no-proto */
301
+
302
+ 'use strict'
303
+
304
+ var base64 = require('base64-js')
305
+ var ieee754 = require('ieee754')
306
+
307
+ exports.Buffer = Buffer
308
+ exports.SlowBuffer = SlowBuffer
309
+ exports.INSPECT_MAX_BYTES = 50
310
+
311
+ var K_MAX_LENGTH = 0x7fffffff
312
+ exports.kMaxLength = K_MAX_LENGTH
313
+
314
+ /**
315
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
316
+ * === true Use Uint8Array implementation (fastest)
317
+ * === false Print warning and recommend using `buffer` v4.x which has an Object
318
+ * implementation (most compatible, even IE6)
319
+ *
320
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
321
+ * Opera 11.6+, iOS 4.2+.
322
+ *
323
+ * We report that the browser does not support typed arrays if the are not subclassable
324
+ * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
325
+ * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
326
+ * for __proto__ and has a buggy typed array implementation.
327
+ */
328
+ Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
329
+
330
+ if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
331
+ typeof console.error === 'function') {
332
+ console.error(
333
+ 'This browser lacks typed array (Uint8Array) support which is required by ' +
334
+ '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
335
+ )
336
+ }
337
+
338
+ function typedArraySupport () {
339
+ // Can typed array instances can be augmented?
340
+ try {
341
+ var arr = new Uint8Array(1)
342
+ arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
343
+ return arr.foo() === 42
344
+ } catch (e) {
345
+ return false
346
+ }
347
+ }
348
+
349
+ Object.defineProperty(Buffer.prototype, 'parent', {
350
+ enumerable: true,
351
+ get: function () {
352
+ if (!Buffer.isBuffer(this)) return undefined
353
+ return this.buffer
354
+ }
355
+ })
356
+
357
+ Object.defineProperty(Buffer.prototype, 'offset', {
358
+ enumerable: true,
359
+ get: function () {
360
+ if (!Buffer.isBuffer(this)) return undefined
361
+ return this.byteOffset
362
+ }
363
+ })
364
+
365
+ function createBuffer (length) {
366
+ if (length > K_MAX_LENGTH) {
367
+ throw new RangeError('The value "' + length + '" is invalid for option "size"')
368
+ }
369
+ // Return an augmented `Uint8Array` instance
370
+ var buf = new Uint8Array(length)
371
+ buf.__proto__ = Buffer.prototype
372
+ return buf
373
+ }
374
+
375
+ /**
376
+ * The Buffer constructor returns instances of `Uint8Array` that have their
377
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
378
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
379
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
380
+ * returns a single octet.
381
+ *
382
+ * The `Uint8Array` prototype remains unmodified.
383
+ */
384
+
385
+ function Buffer (arg, encodingOrOffset, length) {
386
+ // Common case.
387
+ if (typeof arg === 'number') {
388
+ if (typeof encodingOrOffset === 'string') {
389
+ throw new TypeError(
390
+ 'The "string" argument must be of type string. Received type number'
391
+ )
392
+ }
393
+ return allocUnsafe(arg)
394
+ }
395
+ return from(arg, encodingOrOffset, length)
396
+ }
397
+
398
+ // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
399
+ if (typeof Symbol !== 'undefined' && Symbol.species != null &&
400
+ Buffer[Symbol.species] === Buffer) {
401
+ Object.defineProperty(Buffer, Symbol.species, {
402
+ value: null,
403
+ configurable: true,
404
+ enumerable: false,
405
+ writable: false
406
+ })
407
+ }
408
+
409
+ Buffer.poolSize = 8192 // not used by this implementation
410
+
411
+ function from (value, encodingOrOffset, length) {
412
+ if (typeof value === 'string') {
413
+ return fromString(value, encodingOrOffset)
414
+ }
415
+
416
+ if (ArrayBuffer.isView(value)) {
417
+ return fromArrayLike(value)
418
+ }
419
+
420
+ if (value == null) {
421
+ throw TypeError(
422
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
423
+ 'or Array-like Object. Received type ' + (typeof value)
424
+ )
425
+ }
426
+
427
+ if (isInstance(value, ArrayBuffer) ||
428
+ (value && isInstance(value.buffer, ArrayBuffer))) {
429
+ return fromArrayBuffer(value, encodingOrOffset, length)
430
+ }
431
+
432
+ if (typeof value === 'number') {
433
+ throw new TypeError(
434
+ 'The "value" argument must not be of type number. Received type number'
435
+ )
436
+ }
437
+
438
+ var valueOf = value.valueOf && value.valueOf()
439
+ if (valueOf != null && valueOf !== value) {
440
+ return Buffer.from(valueOf, encodingOrOffset, length)
441
+ }
442
+
443
+ var b = fromObject(value)
444
+ if (b) return b
445
+
446
+ if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
447
+ typeof value[Symbol.toPrimitive] === 'function') {
448
+ return Buffer.from(
449
+ value[Symbol.toPrimitive]('string'), encodingOrOffset, length
450
+ )
451
+ }
452
+
453
+ throw new TypeError(
454
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
455
+ 'or Array-like Object. Received type ' + (typeof value)
456
+ )
457
+ }
458
+
459
+ /**
460
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
461
+ * if value is a number.
462
+ * Buffer.from(str[, encoding])
463
+ * Buffer.from(array)
464
+ * Buffer.from(buffer)
465
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
466
+ **/
467
+ Buffer.from = function (value, encodingOrOffset, length) {
468
+ return from(value, encodingOrOffset, length)
469
+ }
470
+
471
+ // Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
472
+ // https://github.com/feross/buffer/pull/148
473
+ Buffer.prototype.__proto__ = Uint8Array.prototype
474
+ Buffer.__proto__ = Uint8Array
475
+
476
+ function assertSize (size) {
477
+ if (typeof size !== 'number') {
478
+ throw new TypeError('"size" argument must be of type number')
479
+ } else if (size < 0) {
480
+ throw new RangeError('The value "' + size + '" is invalid for option "size"')
481
+ }
482
+ }
483
+
484
+ function alloc (size, fill, encoding) {
485
+ assertSize(size)
486
+ if (size <= 0) {
487
+ return createBuffer(size)
488
+ }
489
+ if (fill !== undefined) {
490
+ // Only pay attention to encoding if it's a string. This
491
+ // prevents accidentally sending in a number that would
492
+ // be interpretted as a start offset.
493
+ return typeof encoding === 'string'
494
+ ? createBuffer(size).fill(fill, encoding)
495
+ : createBuffer(size).fill(fill)
496
+ }
497
+ return createBuffer(size)
498
+ }
499
+
500
+ /**
501
+ * Creates a new filled Buffer instance.
502
+ * alloc(size[, fill[, encoding]])
503
+ **/
504
+ Buffer.alloc = function (size, fill, encoding) {
505
+ return alloc(size, fill, encoding)
506
+ }
507
+
508
+ function allocUnsafe (size) {
509
+ assertSize(size)
510
+ return createBuffer(size < 0 ? 0 : checked(size) | 0)
511
+ }
512
+
513
+ /**
514
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
515
+ * */
516
+ Buffer.allocUnsafe = function (size) {
517
+ return allocUnsafe(size)
518
+ }
519
+ /**
520
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
521
+ */
522
+ Buffer.allocUnsafeSlow = function (size) {
523
+ return allocUnsafe(size)
524
+ }
525
+
526
+ function fromString (string, encoding) {
527
+ if (typeof encoding !== 'string' || encoding === '') {
528
+ encoding = 'utf8'
529
+ }
530
+
531
+ if (!Buffer.isEncoding(encoding)) {
532
+ throw new TypeError('Unknown encoding: ' + encoding)
533
+ }
534
+
535
+ var length = byteLength(string, encoding) | 0
536
+ var buf = createBuffer(length)
537
+
538
+ var actual = buf.write(string, encoding)
539
+
540
+ if (actual !== length) {
541
+ // Writing a hex string, for example, that contains invalid characters will
542
+ // cause everything after the first invalid character to be ignored. (e.g.
543
+ // 'abxxcd' will be treated as 'ab')
544
+ buf = buf.slice(0, actual)
545
+ }
546
+
547
+ return buf
548
+ }
549
+
550
+ function fromArrayLike (array) {
551
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
552
+ var buf = createBuffer(length)
553
+ for (var i = 0; i < length; i += 1) {
554
+ buf[i] = array[i] & 255
555
+ }
556
+ return buf
557
+ }
558
+
559
+ function fromArrayBuffer (array, byteOffset, length) {
560
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
561
+ throw new RangeError('"offset" is outside of buffer bounds')
562
+ }
563
+
564
+ if (array.byteLength < byteOffset + (length || 0)) {
565
+ throw new RangeError('"length" is outside of buffer bounds')
566
+ }
567
+
568
+ var buf
569
+ if (byteOffset === undefined && length === undefined) {
570
+ buf = new Uint8Array(array)
571
+ } else if (length === undefined) {
572
+ buf = new Uint8Array(array, byteOffset)
573
+ } else {
574
+ buf = new Uint8Array(array, byteOffset, length)
575
+ }
576
+
577
+ // Return an augmented `Uint8Array` instance
578
+ buf.__proto__ = Buffer.prototype
579
+ return buf
580
+ }
581
+
582
+ function fromObject (obj) {
583
+ if (Buffer.isBuffer(obj)) {
584
+ var len = checked(obj.length) | 0
585
+ var buf = createBuffer(len)
586
+
587
+ if (buf.length === 0) {
588
+ return buf
589
+ }
590
+
591
+ obj.copy(buf, 0, 0, len)
592
+ return buf
593
+ }
594
+
595
+ if (obj.length !== undefined) {
596
+ if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
597
+ return createBuffer(0)
598
+ }
599
+ return fromArrayLike(obj)
600
+ }
601
+
602
+ if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
603
+ return fromArrayLike(obj.data)
604
+ }
605
+ }
606
+
607
+ function checked (length) {
608
+ // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
609
+ // length is NaN (which is otherwise coerced to zero.)
610
+ if (length >= K_MAX_LENGTH) {
611
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
612
+ 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
613
+ }
614
+ return length | 0
615
+ }
616
+
617
+ function SlowBuffer (length) {
618
+ if (+length != length) { // eslint-disable-line eqeqeq
619
+ length = 0
620
+ }
621
+ return Buffer.alloc(+length)
622
+ }
623
+
624
+ Buffer.isBuffer = function isBuffer (b) {
625
+ return b != null && b._isBuffer === true &&
626
+ b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
627
+ }
628
+
629
+ Buffer.compare = function compare (a, b) {
630
+ if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
631
+ if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
632
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
633
+ throw new TypeError(
634
+ 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
635
+ )
636
+ }
637
+
638
+ if (a === b) return 0
639
+
640
+ var x = a.length
641
+ var y = b.length
642
+
643
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
644
+ if (a[i] !== b[i]) {
645
+ x = a[i]
646
+ y = b[i]
647
+ break
648
+ }
649
+ }
650
+
651
+ if (x < y) return -1
652
+ if (y < x) return 1
653
+ return 0
654
+ }
655
+
656
+ Buffer.isEncoding = function isEncoding (encoding) {
657
+ switch (String(encoding).toLowerCase()) {
658
+ case 'hex':
659
+ case 'utf8':
660
+ case 'utf-8':
661
+ case 'ascii':
662
+ case 'latin1':
663
+ case 'binary':
664
+ case 'base64':
665
+ case 'ucs2':
666
+ case 'ucs-2':
667
+ case 'utf16le':
668
+ case 'utf-16le':
669
+ return true
670
+ default:
671
+ return false
672
+ }
673
+ }
674
+
675
+ Buffer.concat = function concat (list, length) {
676
+ if (!Array.isArray(list)) {
677
+ throw new TypeError('"list" argument must be an Array of Buffers')
678
+ }
679
+
680
+ if (list.length === 0) {
681
+ return Buffer.alloc(0)
682
+ }
683
+
684
+ var i
685
+ if (length === undefined) {
686
+ length = 0
687
+ for (i = 0; i < list.length; ++i) {
688
+ length += list[i].length
689
+ }
690
+ }
691
+
692
+ var buffer = Buffer.allocUnsafe(length)
693
+ var pos = 0
694
+ for (i = 0; i < list.length; ++i) {
695
+ var buf = list[i]
696
+ if (isInstance(buf, Uint8Array)) {
697
+ buf = Buffer.from(buf)
698
+ }
699
+ if (!Buffer.isBuffer(buf)) {
700
+ throw new TypeError('"list" argument must be an Array of Buffers')
701
+ }
702
+ buf.copy(buffer, pos)
703
+ pos += buf.length
704
+ }
705
+ return buffer
706
+ }
707
+
708
+ function byteLength (string, encoding) {
709
+ if (Buffer.isBuffer(string)) {
710
+ return string.length
711
+ }
712
+ if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
713
+ return string.byteLength
714
+ }
715
+ if (typeof string !== 'string') {
716
+ throw new TypeError(
717
+ 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
718
+ 'Received type ' + typeof string
719
+ )
720
+ }
721
+
722
+ var len = string.length
723
+ var mustMatch = (arguments.length > 2 && arguments[2] === true)
724
+ if (!mustMatch && len === 0) return 0
725
+
726
+ // Use a for loop to avoid recursion
727
+ var loweredCase = false
728
+ for (;;) {
729
+ switch (encoding) {
730
+ case 'ascii':
731
+ case 'latin1':
732
+ case 'binary':
733
+ return len
734
+ case 'utf8':
735
+ case 'utf-8':
736
+ return utf8ToBytes(string).length
737
+ case 'ucs2':
738
+ case 'ucs-2':
739
+ case 'utf16le':
740
+ case 'utf-16le':
741
+ return len * 2
742
+ case 'hex':
743
+ return len >>> 1
744
+ case 'base64':
745
+ return base64ToBytes(string).length
746
+ default:
747
+ if (loweredCase) {
748
+ return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
749
+ }
750
+ encoding = ('' + encoding).toLowerCase()
751
+ loweredCase = true
752
+ }
753
+ }
754
+ }
755
+ Buffer.byteLength = byteLength
756
+
757
+ function slowToString (encoding, start, end) {
758
+ var loweredCase = false
759
+
760
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
761
+ // property of a typed array.
762
+
763
+ // This behaves neither like String nor Uint8Array in that we set start/end
764
+ // to their upper/lower bounds if the value passed is out of range.
765
+ // undefined is handled specially as per ECMA-262 6th Edition,
766
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
767
+ if (start === undefined || start < 0) {
768
+ start = 0
769
+ }
770
+ // Return early if start > this.length. Done here to prevent potential uint32
771
+ // coercion fail below.
772
+ if (start > this.length) {
773
+ return ''
774
+ }
775
+
776
+ if (end === undefined || end > this.length) {
777
+ end = this.length
778
+ }
779
+
780
+ if (end <= 0) {
781
+ return ''
782
+ }
783
+
784
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
785
+ end >>>= 0
786
+ start >>>= 0
787
+
788
+ if (end <= start) {
789
+ return ''
790
+ }
791
+
792
+ if (!encoding) encoding = 'utf8'
793
+
794
+ while (true) {
795
+ switch (encoding) {
796
+ case 'hex':
797
+ return hexSlice(this, start, end)
798
+
799
+ case 'utf8':
800
+ case 'utf-8':
801
+ return utf8Slice(this, start, end)
802
+
803
+ case 'ascii':
804
+ return asciiSlice(this, start, end)
805
+
806
+ case 'latin1':
807
+ case 'binary':
808
+ return latin1Slice(this, start, end)
809
+
810
+ case 'base64':
811
+ return base64Slice(this, start, end)
812
+
813
+ case 'ucs2':
814
+ case 'ucs-2':
815
+ case 'utf16le':
816
+ case 'utf-16le':
817
+ return utf16leSlice(this, start, end)
818
+
819
+ default:
820
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
821
+ encoding = (encoding + '').toLowerCase()
822
+ loweredCase = true
823
+ }
824
+ }
825
+ }
826
+
827
+ // This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
828
+ // to detect a Buffer instance. It's not possible to use `instanceof Buffer`
829
+ // reliably in a browserify context because there could be multiple different
830
+ // copies of the 'buffer' package in use. This method works even for Buffer
831
+ // instances that were created from another copy of the `buffer` package.
832
+ // See: https://github.com/feross/buffer/issues/154
833
+ Buffer.prototype._isBuffer = true
834
+
835
+ function swap (b, n, m) {
836
+ var i = b[n]
837
+ b[n] = b[m]
838
+ b[m] = i
839
+ }
840
+
841
+ Buffer.prototype.swap16 = function swap16 () {
842
+ var len = this.length
843
+ if (len % 2 !== 0) {
844
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
845
+ }
846
+ for (var i = 0; i < len; i += 2) {
847
+ swap(this, i, i + 1)
848
+ }
849
+ return this
850
+ }
851
+
852
+ Buffer.prototype.swap32 = function swap32 () {
853
+ var len = this.length
854
+ if (len % 4 !== 0) {
855
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
856
+ }
857
+ for (var i = 0; i < len; i += 4) {
858
+ swap(this, i, i + 3)
859
+ swap(this, i + 1, i + 2)
860
+ }
861
+ return this
862
+ }
863
+
864
+ Buffer.prototype.swap64 = function swap64 () {
865
+ var len = this.length
866
+ if (len % 8 !== 0) {
867
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
868
+ }
869
+ for (var i = 0; i < len; i += 8) {
870
+ swap(this, i, i + 7)
871
+ swap(this, i + 1, i + 6)
872
+ swap(this, i + 2, i + 5)
873
+ swap(this, i + 3, i + 4)
874
+ }
875
+ return this
876
+ }
877
+
878
+ Buffer.prototype.toString = function toString () {
879
+ var length = this.length
880
+ if (length === 0) return ''
881
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
882
+ return slowToString.apply(this, arguments)
883
+ }
884
+
885
+ Buffer.prototype.toLocaleString = Buffer.prototype.toString
886
+
887
+ Buffer.prototype.equals = function equals (b) {
888
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
889
+ if (this === b) return true
890
+ return Buffer.compare(this, b) === 0
891
+ }
892
+
893
+ Buffer.prototype.inspect = function inspect () {
894
+ var str = ''
895
+ var max = exports.INSPECT_MAX_BYTES
896
+ str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
897
+ if (this.length > max) str += ' ... '
898
+ return '<Buffer ' + str + '>'
899
+ }
900
+
901
+ Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
902
+ if (isInstance(target, Uint8Array)) {
903
+ target = Buffer.from(target, target.offset, target.byteLength)
904
+ }
905
+ if (!Buffer.isBuffer(target)) {
906
+ throw new TypeError(
907
+ 'The "target" argument must be one of type Buffer or Uint8Array. ' +
908
+ 'Received type ' + (typeof target)
909
+ )
910
+ }
911
+
912
+ if (start === undefined) {
913
+ start = 0
914
+ }
915
+ if (end === undefined) {
916
+ end = target ? target.length : 0
917
+ }
918
+ if (thisStart === undefined) {
919
+ thisStart = 0
920
+ }
921
+ if (thisEnd === undefined) {
922
+ thisEnd = this.length
923
+ }
924
+
925
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
926
+ throw new RangeError('out of range index')
927
+ }
928
+
929
+ if (thisStart >= thisEnd && start >= end) {
930
+ return 0
931
+ }
932
+ if (thisStart >= thisEnd) {
933
+ return -1
934
+ }
935
+ if (start >= end) {
936
+ return 1
937
+ }
938
+
939
+ start >>>= 0
940
+ end >>>= 0
941
+ thisStart >>>= 0
942
+ thisEnd >>>= 0
943
+
944
+ if (this === target) return 0
945
+
946
+ var x = thisEnd - thisStart
947
+ var y = end - start
948
+ var len = Math.min(x, y)
949
+
950
+ var thisCopy = this.slice(thisStart, thisEnd)
951
+ var targetCopy = target.slice(start, end)
952
+
953
+ for (var i = 0; i < len; ++i) {
954
+ if (thisCopy[i] !== targetCopy[i]) {
955
+ x = thisCopy[i]
956
+ y = targetCopy[i]
957
+ break
958
+ }
959
+ }
960
+
961
+ if (x < y) return -1
962
+ if (y < x) return 1
963
+ return 0
964
+ }
965
+
966
+ // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
967
+ // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
968
+ //
969
+ // Arguments:
970
+ // - buffer - a Buffer to search
971
+ // - val - a string, Buffer, or number
972
+ // - byteOffset - an index into `buffer`; will be clamped to an int32
973
+ // - encoding - an optional encoding, relevant is val is a string
974
+ // - dir - true for indexOf, false for lastIndexOf
975
+ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
976
+ // Empty buffer means no match
977
+ if (buffer.length === 0) return -1
978
+
979
+ // Normalize byteOffset
980
+ if (typeof byteOffset === 'string') {
981
+ encoding = byteOffset
982
+ byteOffset = 0
983
+ } else if (byteOffset > 0x7fffffff) {
984
+ byteOffset = 0x7fffffff
985
+ } else if (byteOffset < -0x80000000) {
986
+ byteOffset = -0x80000000
987
+ }
988
+ byteOffset = +byteOffset // Coerce to Number.
989
+ if (numberIsNaN(byteOffset)) {
990
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
991
+ byteOffset = dir ? 0 : (buffer.length - 1)
992
+ }
993
+
994
+ // Normalize byteOffset: negative offsets start from the end of the buffer
995
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
996
+ if (byteOffset >= buffer.length) {
997
+ if (dir) return -1
998
+ else byteOffset = buffer.length - 1
999
+ } else if (byteOffset < 0) {
1000
+ if (dir) byteOffset = 0
1001
+ else return -1
1002
+ }
1003
+
1004
+ // Normalize val
1005
+ if (typeof val === 'string') {
1006
+ val = Buffer.from(val, encoding)
1007
+ }
1008
+
1009
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
1010
+ if (Buffer.isBuffer(val)) {
1011
+ // Special case: looking for empty string/buffer always fails
1012
+ if (val.length === 0) {
1013
+ return -1
1014
+ }
1015
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
1016
+ } else if (typeof val === 'number') {
1017
+ val = val & 0xFF // Search for a byte value [0-255]
1018
+ if (typeof Uint8Array.prototype.indexOf === 'function') {
1019
+ if (dir) {
1020
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
1021
+ } else {
1022
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
1023
+ }
1024
+ }
1025
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
1026
+ }
1027
+
1028
+ throw new TypeError('val must be string, number or Buffer')
1029
+ }
1030
+
1031
+ function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
1032
+ var indexSize = 1
1033
+ var arrLength = arr.length
1034
+ var valLength = val.length
1035
+
1036
+ if (encoding !== undefined) {
1037
+ encoding = String(encoding).toLowerCase()
1038
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
1039
+ encoding === 'utf16le' || encoding === 'utf-16le') {
1040
+ if (arr.length < 2 || val.length < 2) {
1041
+ return -1
1042
+ }
1043
+ indexSize = 2
1044
+ arrLength /= 2
1045
+ valLength /= 2
1046
+ byteOffset /= 2
1047
+ }
1048
+ }
1049
+
1050
+ function read (buf, i) {
1051
+ if (indexSize === 1) {
1052
+ return buf[i]
1053
+ } else {
1054
+ return buf.readUInt16BE(i * indexSize)
1055
+ }
1056
+ }
1057
+
1058
+ var i
1059
+ if (dir) {
1060
+ var foundIndex = -1
1061
+ for (i = byteOffset; i < arrLength; i++) {
1062
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
1063
+ if (foundIndex === -1) foundIndex = i
1064
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
1065
+ } else {
1066
+ if (foundIndex !== -1) i -= i - foundIndex
1067
+ foundIndex = -1
1068
+ }
1069
+ }
1070
+ } else {
1071
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
1072
+ for (i = byteOffset; i >= 0; i--) {
1073
+ var found = true
1074
+ for (var j = 0; j < valLength; j++) {
1075
+ if (read(arr, i + j) !== read(val, j)) {
1076
+ found = false
1077
+ break
1078
+ }
1079
+ }
1080
+ if (found) return i
1081
+ }
1082
+ }
1083
+
1084
+ return -1
1085
+ }
1086
+
1087
+ Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
1088
+ return this.indexOf(val, byteOffset, encoding) !== -1
1089
+ }
1090
+
1091
+ Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
1092
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
1093
+ }
1094
+
1095
+ Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
1096
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
1097
+ }
1098
+
1099
+ function hexWrite (buf, string, offset, length) {
1100
+ offset = Number(offset) || 0
1101
+ var remaining = buf.length - offset
1102
+ if (!length) {
1103
+ length = remaining
1104
+ } else {
1105
+ length = Number(length)
1106
+ if (length > remaining) {
1107
+ length = remaining
1108
+ }
1109
+ }
1110
+
1111
+ var strLen = string.length
1112
+
1113
+ if (length > strLen / 2) {
1114
+ length = strLen / 2
1115
+ }
1116
+ for (var i = 0; i < length; ++i) {
1117
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
1118
+ if (numberIsNaN(parsed)) return i
1119
+ buf[offset + i] = parsed
1120
+ }
1121
+ return i
1122
+ }
1123
+
1124
+ function utf8Write (buf, string, offset, length) {
1125
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
1126
+ }
1127
+
1128
+ function asciiWrite (buf, string, offset, length) {
1129
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
1130
+ }
1131
+
1132
+ function latin1Write (buf, string, offset, length) {
1133
+ return asciiWrite(buf, string, offset, length)
1134
+ }
1135
+
1136
+ function base64Write (buf, string, offset, length) {
1137
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
1138
+ }
1139
+
1140
+ function ucs2Write (buf, string, offset, length) {
1141
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
1142
+ }
1143
+
1144
+ Buffer.prototype.write = function write (string, offset, length, encoding) {
1145
+ // Buffer#write(string)
1146
+ if (offset === undefined) {
1147
+ encoding = 'utf8'
1148
+ length = this.length
1149
+ offset = 0
1150
+ // Buffer#write(string, encoding)
1151
+ } else if (length === undefined && typeof offset === 'string') {
1152
+ encoding = offset
1153
+ length = this.length
1154
+ offset = 0
1155
+ // Buffer#write(string, offset[, length][, encoding])
1156
+ } else if (isFinite(offset)) {
1157
+ offset = offset >>> 0
1158
+ if (isFinite(length)) {
1159
+ length = length >>> 0
1160
+ if (encoding === undefined) encoding = 'utf8'
1161
+ } else {
1162
+ encoding = length
1163
+ length = undefined
1164
+ }
1165
+ } else {
1166
+ throw new Error(
1167
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
1168
+ )
1169
+ }
1170
+
1171
+ var remaining = this.length - offset
1172
+ if (length === undefined || length > remaining) length = remaining
1173
+
1174
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
1175
+ throw new RangeError('Attempt to write outside buffer bounds')
1176
+ }
1177
+
1178
+ if (!encoding) encoding = 'utf8'
1179
+
1180
+ var loweredCase = false
1181
+ for (;;) {
1182
+ switch (encoding) {
1183
+ case 'hex':
1184
+ return hexWrite(this, string, offset, length)
1185
+
1186
+ case 'utf8':
1187
+ case 'utf-8':
1188
+ return utf8Write(this, string, offset, length)
1189
+
1190
+ case 'ascii':
1191
+ return asciiWrite(this, string, offset, length)
1192
+
1193
+ case 'latin1':
1194
+ case 'binary':
1195
+ return latin1Write(this, string, offset, length)
1196
+
1197
+ case 'base64':
1198
+ // Warning: maxLength not taken into account in base64Write
1199
+ return base64Write(this, string, offset, length)
1200
+
1201
+ case 'ucs2':
1202
+ case 'ucs-2':
1203
+ case 'utf16le':
1204
+ case 'utf-16le':
1205
+ return ucs2Write(this, string, offset, length)
1206
+
1207
+ default:
1208
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
1209
+ encoding = ('' + encoding).toLowerCase()
1210
+ loweredCase = true
1211
+ }
1212
+ }
1213
+ }
1214
+
1215
+ Buffer.prototype.toJSON = function toJSON () {
1216
+ return {
1217
+ type: 'Buffer',
1218
+ data: Array.prototype.slice.call(this._arr || this, 0)
1219
+ }
1220
+ }
1221
+
1222
+ function base64Slice (buf, start, end) {
1223
+ if (start === 0 && end === buf.length) {
1224
+ return base64.fromByteArray(buf)
1225
+ } else {
1226
+ return base64.fromByteArray(buf.slice(start, end))
1227
+ }
1228
+ }
1229
+
1230
+ function utf8Slice (buf, start, end) {
1231
+ end = Math.min(buf.length, end)
1232
+ var res = []
1233
+
1234
+ var i = start
1235
+ while (i < end) {
1236
+ var firstByte = buf[i]
1237
+ var codePoint = null
1238
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
1239
+ : (firstByte > 0xDF) ? 3
1240
+ : (firstByte > 0xBF) ? 2
1241
+ : 1
1242
+
1243
+ if (i + bytesPerSequence <= end) {
1244
+ var secondByte, thirdByte, fourthByte, tempCodePoint
1245
+
1246
+ switch (bytesPerSequence) {
1247
+ case 1:
1248
+ if (firstByte < 0x80) {
1249
+ codePoint = firstByte
1250
+ }
1251
+ break
1252
+ case 2:
1253
+ secondByte = buf[i + 1]
1254
+ if ((secondByte & 0xC0) === 0x80) {
1255
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
1256
+ if (tempCodePoint > 0x7F) {
1257
+ codePoint = tempCodePoint
1258
+ }
1259
+ }
1260
+ break
1261
+ case 3:
1262
+ secondByte = buf[i + 1]
1263
+ thirdByte = buf[i + 2]
1264
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
1265
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
1266
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
1267
+ codePoint = tempCodePoint
1268
+ }
1269
+ }
1270
+ break
1271
+ case 4:
1272
+ secondByte = buf[i + 1]
1273
+ thirdByte = buf[i + 2]
1274
+ fourthByte = buf[i + 3]
1275
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
1276
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
1277
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
1278
+ codePoint = tempCodePoint
1279
+ }
1280
+ }
1281
+ }
1282
+ }
1283
+
1284
+ if (codePoint === null) {
1285
+ // we did not generate a valid codePoint so insert a
1286
+ // replacement char (U+FFFD) and advance only 1 byte
1287
+ codePoint = 0xFFFD
1288
+ bytesPerSequence = 1
1289
+ } else if (codePoint > 0xFFFF) {
1290
+ // encode to utf16 (surrogate pair dance)
1291
+ codePoint -= 0x10000
1292
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
1293
+ codePoint = 0xDC00 | codePoint & 0x3FF
1294
+ }
1295
+
1296
+ res.push(codePoint)
1297
+ i += bytesPerSequence
1298
+ }
1299
+
1300
+ return decodeCodePointsArray(res)
1301
+ }
1302
+
1303
+ // Based on http://stackoverflow.com/a/22747272/680742, the browser with
1304
+ // the lowest limit is Chrome, with 0x10000 args.
1305
+ // We go 1 magnitude less, for safety
1306
+ var MAX_ARGUMENTS_LENGTH = 0x1000
1307
+
1308
+ function decodeCodePointsArray (codePoints) {
1309
+ var len = codePoints.length
1310
+ if (len <= MAX_ARGUMENTS_LENGTH) {
1311
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
1312
+ }
1313
+
1314
+ // Decode in chunks to avoid "call stack size exceeded".
1315
+ var res = ''
1316
+ var i = 0
1317
+ while (i < len) {
1318
+ res += String.fromCharCode.apply(
1319
+ String,
1320
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
1321
+ )
1322
+ }
1323
+ return res
1324
+ }
1325
+
1326
+ function asciiSlice (buf, start, end) {
1327
+ var ret = ''
1328
+ end = Math.min(buf.length, end)
1329
+
1330
+ for (var i = start; i < end; ++i) {
1331
+ ret += String.fromCharCode(buf[i] & 0x7F)
1332
+ }
1333
+ return ret
1334
+ }
1335
+
1336
+ function latin1Slice (buf, start, end) {
1337
+ var ret = ''
1338
+ end = Math.min(buf.length, end)
1339
+
1340
+ for (var i = start; i < end; ++i) {
1341
+ ret += String.fromCharCode(buf[i])
1342
+ }
1343
+ return ret
1344
+ }
1345
+
1346
+ function hexSlice (buf, start, end) {
1347
+ var len = buf.length
1348
+
1349
+ if (!start || start < 0) start = 0
1350
+ if (!end || end < 0 || end > len) end = len
1351
+
1352
+ var out = ''
1353
+ for (var i = start; i < end; ++i) {
1354
+ out += toHex(buf[i])
1355
+ }
1356
+ return out
1357
+ }
1358
+
1359
+ function utf16leSlice (buf, start, end) {
1360
+ var bytes = buf.slice(start, end)
1361
+ var res = ''
1362
+ for (var i = 0; i < bytes.length; i += 2) {
1363
+ res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
1364
+ }
1365
+ return res
1366
+ }
1367
+
1368
+ Buffer.prototype.slice = function slice (start, end) {
1369
+ var len = this.length
1370
+ start = ~~start
1371
+ end = end === undefined ? len : ~~end
1372
+
1373
+ if (start < 0) {
1374
+ start += len
1375
+ if (start < 0) start = 0
1376
+ } else if (start > len) {
1377
+ start = len
1378
+ }
1379
+
1380
+ if (end < 0) {
1381
+ end += len
1382
+ if (end < 0) end = 0
1383
+ } else if (end > len) {
1384
+ end = len
1385
+ }
1386
+
1387
+ if (end < start) end = start
1388
+
1389
+ var newBuf = this.subarray(start, end)
1390
+ // Return an augmented `Uint8Array` instance
1391
+ newBuf.__proto__ = Buffer.prototype
1392
+ return newBuf
1393
+ }
1394
+
1395
+ /*
1396
+ * Need to make sure that buffer isn't trying to write out of bounds.
1397
+ */
1398
+ function checkOffset (offset, ext, length) {
1399
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
1400
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
1401
+ }
1402
+
1403
+ Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
1404
+ offset = offset >>> 0
1405
+ byteLength = byteLength >>> 0
1406
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
1407
+
1408
+ var val = this[offset]
1409
+ var mul = 1
1410
+ var i = 0
1411
+ while (++i < byteLength && (mul *= 0x100)) {
1412
+ val += this[offset + i] * mul
1413
+ }
1414
+
1415
+ return val
1416
+ }
1417
+
1418
+ Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
1419
+ offset = offset >>> 0
1420
+ byteLength = byteLength >>> 0
1421
+ if (!noAssert) {
1422
+ checkOffset(offset, byteLength, this.length)
1423
+ }
1424
+
1425
+ var val = this[offset + --byteLength]
1426
+ var mul = 1
1427
+ while (byteLength > 0 && (mul *= 0x100)) {
1428
+ val += this[offset + --byteLength] * mul
1429
+ }
1430
+
1431
+ return val
1432
+ }
1433
+
1434
+ Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
1435
+ offset = offset >>> 0
1436
+ if (!noAssert) checkOffset(offset, 1, this.length)
1437
+ return this[offset]
1438
+ }
1439
+
1440
+ Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
1441
+ offset = offset >>> 0
1442
+ if (!noAssert) checkOffset(offset, 2, this.length)
1443
+ return this[offset] | (this[offset + 1] << 8)
1444
+ }
1445
+
1446
+ Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
1447
+ offset = offset >>> 0
1448
+ if (!noAssert) checkOffset(offset, 2, this.length)
1449
+ return (this[offset] << 8) | this[offset + 1]
1450
+ }
1451
+
1452
+ Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
1453
+ offset = offset >>> 0
1454
+ if (!noAssert) checkOffset(offset, 4, this.length)
1455
+
1456
+ return ((this[offset]) |
1457
+ (this[offset + 1] << 8) |
1458
+ (this[offset + 2] << 16)) +
1459
+ (this[offset + 3] * 0x1000000)
1460
+ }
1461
+
1462
+ Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
1463
+ offset = offset >>> 0
1464
+ if (!noAssert) checkOffset(offset, 4, this.length)
1465
+
1466
+ return (this[offset] * 0x1000000) +
1467
+ ((this[offset + 1] << 16) |
1468
+ (this[offset + 2] << 8) |
1469
+ this[offset + 3])
1470
+ }
1471
+
1472
+ Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
1473
+ offset = offset >>> 0
1474
+ byteLength = byteLength >>> 0
1475
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
1476
+
1477
+ var val = this[offset]
1478
+ var mul = 1
1479
+ var i = 0
1480
+ while (++i < byteLength && (mul *= 0x100)) {
1481
+ val += this[offset + i] * mul
1482
+ }
1483
+ mul *= 0x80
1484
+
1485
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
1486
+
1487
+ return val
1488
+ }
1489
+
1490
+ Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
1491
+ offset = offset >>> 0
1492
+ byteLength = byteLength >>> 0
1493
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
1494
+
1495
+ var i = byteLength
1496
+ var mul = 1
1497
+ var val = this[offset + --i]
1498
+ while (i > 0 && (mul *= 0x100)) {
1499
+ val += this[offset + --i] * mul
1500
+ }
1501
+ mul *= 0x80
1502
+
1503
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
1504
+
1505
+ return val
1506
+ }
1507
+
1508
+ Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
1509
+ offset = offset >>> 0
1510
+ if (!noAssert) checkOffset(offset, 1, this.length)
1511
+ if (!(this[offset] & 0x80)) return (this[offset])
1512
+ return ((0xff - this[offset] + 1) * -1)
1513
+ }
1514
+
1515
+ Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
1516
+ offset = offset >>> 0
1517
+ if (!noAssert) checkOffset(offset, 2, this.length)
1518
+ var val = this[offset] | (this[offset + 1] << 8)
1519
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
1520
+ }
1521
+
1522
+ Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
1523
+ offset = offset >>> 0
1524
+ if (!noAssert) checkOffset(offset, 2, this.length)
1525
+ var val = this[offset + 1] | (this[offset] << 8)
1526
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
1527
+ }
1528
+
1529
+ Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
1530
+ offset = offset >>> 0
1531
+ if (!noAssert) checkOffset(offset, 4, this.length)
1532
+
1533
+ return (this[offset]) |
1534
+ (this[offset + 1] << 8) |
1535
+ (this[offset + 2] << 16) |
1536
+ (this[offset + 3] << 24)
1537
+ }
1538
+
1539
+ Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
1540
+ offset = offset >>> 0
1541
+ if (!noAssert) checkOffset(offset, 4, this.length)
1542
+
1543
+ return (this[offset] << 24) |
1544
+ (this[offset + 1] << 16) |
1545
+ (this[offset + 2] << 8) |
1546
+ (this[offset + 3])
1547
+ }
1548
+
1549
+ Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
1550
+ offset = offset >>> 0
1551
+ if (!noAssert) checkOffset(offset, 4, this.length)
1552
+ return ieee754.read(this, offset, true, 23, 4)
1553
+ }
1554
+
1555
+ Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
1556
+ offset = offset >>> 0
1557
+ if (!noAssert) checkOffset(offset, 4, this.length)
1558
+ return ieee754.read(this, offset, false, 23, 4)
1559
+ }
1560
+
1561
+ Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
1562
+ offset = offset >>> 0
1563
+ if (!noAssert) checkOffset(offset, 8, this.length)
1564
+ return ieee754.read(this, offset, true, 52, 8)
1565
+ }
1566
+
1567
+ Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
1568
+ offset = offset >>> 0
1569
+ if (!noAssert) checkOffset(offset, 8, this.length)
1570
+ return ieee754.read(this, offset, false, 52, 8)
1571
+ }
1572
+
1573
+ function checkInt (buf, value, offset, ext, max, min) {
1574
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
1575
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
1576
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
1577
+ }
1578
+
1579
+ Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
1580
+ value = +value
1581
+ offset = offset >>> 0
1582
+ byteLength = byteLength >>> 0
1583
+ if (!noAssert) {
1584
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
1585
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
1586
+ }
1587
+
1588
+ var mul = 1
1589
+ var i = 0
1590
+ this[offset] = value & 0xFF
1591
+ while (++i < byteLength && (mul *= 0x100)) {
1592
+ this[offset + i] = (value / mul) & 0xFF
1593
+ }
1594
+
1595
+ return offset + byteLength
1596
+ }
1597
+
1598
+ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
1599
+ value = +value
1600
+ offset = offset >>> 0
1601
+ byteLength = byteLength >>> 0
1602
+ if (!noAssert) {
1603
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
1604
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
1605
+ }
1606
+
1607
+ var i = byteLength - 1
1608
+ var mul = 1
1609
+ this[offset + i] = value & 0xFF
1610
+ while (--i >= 0 && (mul *= 0x100)) {
1611
+ this[offset + i] = (value / mul) & 0xFF
1612
+ }
1613
+
1614
+ return offset + byteLength
1615
+ }
1616
+
1617
+ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
1618
+ value = +value
1619
+ offset = offset >>> 0
1620
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
1621
+ this[offset] = (value & 0xff)
1622
+ return offset + 1
1623
+ }
1624
+
1625
+ Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
1626
+ value = +value
1627
+ offset = offset >>> 0
1628
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
1629
+ this[offset] = (value & 0xff)
1630
+ this[offset + 1] = (value >>> 8)
1631
+ return offset + 2
1632
+ }
1633
+
1634
+ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
1635
+ value = +value
1636
+ offset = offset >>> 0
1637
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
1638
+ this[offset] = (value >>> 8)
1639
+ this[offset + 1] = (value & 0xff)
1640
+ return offset + 2
1641
+ }
1642
+
1643
+ Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
1644
+ value = +value
1645
+ offset = offset >>> 0
1646
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
1647
+ this[offset + 3] = (value >>> 24)
1648
+ this[offset + 2] = (value >>> 16)
1649
+ this[offset + 1] = (value >>> 8)
1650
+ this[offset] = (value & 0xff)
1651
+ return offset + 4
1652
+ }
1653
+
1654
+ Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
1655
+ value = +value
1656
+ offset = offset >>> 0
1657
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
1658
+ this[offset] = (value >>> 24)
1659
+ this[offset + 1] = (value >>> 16)
1660
+ this[offset + 2] = (value >>> 8)
1661
+ this[offset + 3] = (value & 0xff)
1662
+ return offset + 4
1663
+ }
1664
+
1665
+ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
1666
+ value = +value
1667
+ offset = offset >>> 0
1668
+ if (!noAssert) {
1669
+ var limit = Math.pow(2, (8 * byteLength) - 1)
1670
+
1671
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
1672
+ }
1673
+
1674
+ var i = 0
1675
+ var mul = 1
1676
+ var sub = 0
1677
+ this[offset] = value & 0xFF
1678
+ while (++i < byteLength && (mul *= 0x100)) {
1679
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
1680
+ sub = 1
1681
+ }
1682
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
1683
+ }
1684
+
1685
+ return offset + byteLength
1686
+ }
1687
+
1688
+ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
1689
+ value = +value
1690
+ offset = offset >>> 0
1691
+ if (!noAssert) {
1692
+ var limit = Math.pow(2, (8 * byteLength) - 1)
1693
+
1694
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
1695
+ }
1696
+
1697
+ var i = byteLength - 1
1698
+ var mul = 1
1699
+ var sub = 0
1700
+ this[offset + i] = value & 0xFF
1701
+ while (--i >= 0 && (mul *= 0x100)) {
1702
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
1703
+ sub = 1
1704
+ }
1705
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
1706
+ }
1707
+
1708
+ return offset + byteLength
1709
+ }
1710
+
1711
+ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
1712
+ value = +value
1713
+ offset = offset >>> 0
1714
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
1715
+ if (value < 0) value = 0xff + value + 1
1716
+ this[offset] = (value & 0xff)
1717
+ return offset + 1
1718
+ }
1719
+
1720
+ Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
1721
+ value = +value
1722
+ offset = offset >>> 0
1723
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
1724
+ this[offset] = (value & 0xff)
1725
+ this[offset + 1] = (value >>> 8)
1726
+ return offset + 2
1727
+ }
1728
+
1729
+ Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
1730
+ value = +value
1731
+ offset = offset >>> 0
1732
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
1733
+ this[offset] = (value >>> 8)
1734
+ this[offset + 1] = (value & 0xff)
1735
+ return offset + 2
1736
+ }
1737
+
1738
+ Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
1739
+ value = +value
1740
+ offset = offset >>> 0
1741
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
1742
+ this[offset] = (value & 0xff)
1743
+ this[offset + 1] = (value >>> 8)
1744
+ this[offset + 2] = (value >>> 16)
1745
+ this[offset + 3] = (value >>> 24)
1746
+ return offset + 4
1747
+ }
1748
+
1749
+ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
1750
+ value = +value
1751
+ offset = offset >>> 0
1752
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
1753
+ if (value < 0) value = 0xffffffff + value + 1
1754
+ this[offset] = (value >>> 24)
1755
+ this[offset + 1] = (value >>> 16)
1756
+ this[offset + 2] = (value >>> 8)
1757
+ this[offset + 3] = (value & 0xff)
1758
+ return offset + 4
1759
+ }
1760
+
1761
+ function checkIEEE754 (buf, value, offset, ext, max, min) {
1762
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
1763
+ if (offset < 0) throw new RangeError('Index out of range')
1764
+ }
1765
+
1766
+ function writeFloat (buf, value, offset, littleEndian, noAssert) {
1767
+ value = +value
1768
+ offset = offset >>> 0
1769
+ if (!noAssert) {
1770
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
1771
+ }
1772
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
1773
+ return offset + 4
1774
+ }
1775
+
1776
+ Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
1777
+ return writeFloat(this, value, offset, true, noAssert)
1778
+ }
1779
+
1780
+ Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
1781
+ return writeFloat(this, value, offset, false, noAssert)
1782
+ }
1783
+
1784
+ function writeDouble (buf, value, offset, littleEndian, noAssert) {
1785
+ value = +value
1786
+ offset = offset >>> 0
1787
+ if (!noAssert) {
1788
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
1789
+ }
1790
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
1791
+ return offset + 8
1792
+ }
1793
+
1794
+ Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
1795
+ return writeDouble(this, value, offset, true, noAssert)
1796
+ }
1797
+
1798
+ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
1799
+ return writeDouble(this, value, offset, false, noAssert)
1800
+ }
1801
+
1802
+ // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
1803
+ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
1804
+ if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
1805
+ if (!start) start = 0
1806
+ if (!end && end !== 0) end = this.length
1807
+ if (targetStart >= target.length) targetStart = target.length
1808
+ if (!targetStart) targetStart = 0
1809
+ if (end > 0 && end < start) end = start
1810
+
1811
+ // Copy 0 bytes; we're done
1812
+ if (end === start) return 0
1813
+ if (target.length === 0 || this.length === 0) return 0
1814
+
1815
+ // Fatal error conditions
1816
+ if (targetStart < 0) {
1817
+ throw new RangeError('targetStart out of bounds')
1818
+ }
1819
+ if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
1820
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
1821
+
1822
+ // Are we oob?
1823
+ if (end > this.length) end = this.length
1824
+ if (target.length - targetStart < end - start) {
1825
+ end = target.length - targetStart + start
1826
+ }
1827
+
1828
+ var len = end - start
1829
+
1830
+ if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
1831
+ // Use built-in when available, missing from IE11
1832
+ this.copyWithin(targetStart, start, end)
1833
+ } else if (this === target && start < targetStart && targetStart < end) {
1834
+ // descending copy from end
1835
+ for (var i = len - 1; i >= 0; --i) {
1836
+ target[i + targetStart] = this[i + start]
1837
+ }
1838
+ } else {
1839
+ Uint8Array.prototype.set.call(
1840
+ target,
1841
+ this.subarray(start, end),
1842
+ targetStart
1843
+ )
1844
+ }
1845
+
1846
+ return len
1847
+ }
1848
+
1849
+ // Usage:
1850
+ // buffer.fill(number[, offset[, end]])
1851
+ // buffer.fill(buffer[, offset[, end]])
1852
+ // buffer.fill(string[, offset[, end]][, encoding])
1853
+ Buffer.prototype.fill = function fill (val, start, end, encoding) {
1854
+ // Handle string cases:
1855
+ if (typeof val === 'string') {
1856
+ if (typeof start === 'string') {
1857
+ encoding = start
1858
+ start = 0
1859
+ end = this.length
1860
+ } else if (typeof end === 'string') {
1861
+ encoding = end
1862
+ end = this.length
1863
+ }
1864
+ if (encoding !== undefined && typeof encoding !== 'string') {
1865
+ throw new TypeError('encoding must be a string')
1866
+ }
1867
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
1868
+ throw new TypeError('Unknown encoding: ' + encoding)
1869
+ }
1870
+ if (val.length === 1) {
1871
+ var code = val.charCodeAt(0)
1872
+ if ((encoding === 'utf8' && code < 128) ||
1873
+ encoding === 'latin1') {
1874
+ // Fast path: If `val` fits into a single byte, use that numeric value.
1875
+ val = code
1876
+ }
1877
+ }
1878
+ } else if (typeof val === 'number') {
1879
+ val = val & 255
1880
+ }
1881
+
1882
+ // Invalid ranges are not set to a default, so can range check early.
1883
+ if (start < 0 || this.length < start || this.length < end) {
1884
+ throw new RangeError('Out of range index')
1885
+ }
1886
+
1887
+ if (end <= start) {
1888
+ return this
1889
+ }
1890
+
1891
+ start = start >>> 0
1892
+ end = end === undefined ? this.length : end >>> 0
1893
+
1894
+ if (!val) val = 0
1895
+
1896
+ var i
1897
+ if (typeof val === 'number') {
1898
+ for (i = start; i < end; ++i) {
1899
+ this[i] = val
1900
+ }
1901
+ } else {
1902
+ var bytes = Buffer.isBuffer(val)
1903
+ ? val
1904
+ : Buffer.from(val, encoding)
1905
+ var len = bytes.length
1906
+ if (len === 0) {
1907
+ throw new TypeError('The value "' + val +
1908
+ '" is invalid for argument "value"')
1909
+ }
1910
+ for (i = 0; i < end - start; ++i) {
1911
+ this[i + start] = bytes[i % len]
1912
+ }
1913
+ }
1914
+
1915
+ return this
1916
+ }
1917
+
1918
+ // HELPER FUNCTIONS
1919
+ // ================
1920
+
1921
+ var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
1922
+
1923
+ function base64clean (str) {
1924
+ // Node takes equal signs as end of the Base64 encoding
1925
+ str = str.split('=')[0]
1926
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
1927
+ str = str.trim().replace(INVALID_BASE64_RE, '')
1928
+ // Node converts strings with length < 2 to ''
1929
+ if (str.length < 2) return ''
1930
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
1931
+ while (str.length % 4 !== 0) {
1932
+ str = str + '='
1933
+ }
1934
+ return str
1935
+ }
1936
+
1937
+ function toHex (n) {
1938
+ if (n < 16) return '0' + n.toString(16)
1939
+ return n.toString(16)
1940
+ }
1941
+
1942
+ function utf8ToBytes (string, units) {
1943
+ units = units || Infinity
1944
+ var codePoint
1945
+ var length = string.length
1946
+ var leadSurrogate = null
1947
+ var bytes = []
1948
+
1949
+ for (var i = 0; i < length; ++i) {
1950
+ codePoint = string.charCodeAt(i)
1951
+
1952
+ // is surrogate component
1953
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
1954
+ // last char was a lead
1955
+ if (!leadSurrogate) {
1956
+ // no lead yet
1957
+ if (codePoint > 0xDBFF) {
1958
+ // unexpected trail
1959
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1960
+ continue
1961
+ } else if (i + 1 === length) {
1962
+ // unpaired lead
1963
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1964
+ continue
1965
+ }
1966
+
1967
+ // valid lead
1968
+ leadSurrogate = codePoint
1969
+
1970
+ continue
1971
+ }
1972
+
1973
+ // 2 leads in a row
1974
+ if (codePoint < 0xDC00) {
1975
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1976
+ leadSurrogate = codePoint
1977
+ continue
1978
+ }
1979
+
1980
+ // valid surrogate pair
1981
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
1982
+ } else if (leadSurrogate) {
1983
+ // valid bmp char, but last char was a lead
1984
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
1985
+ }
1986
+
1987
+ leadSurrogate = null
1988
+
1989
+ // encode utf8
1990
+ if (codePoint < 0x80) {
1991
+ if ((units -= 1) < 0) break
1992
+ bytes.push(codePoint)
1993
+ } else if (codePoint < 0x800) {
1994
+ if ((units -= 2) < 0) break
1995
+ bytes.push(
1996
+ codePoint >> 0x6 | 0xC0,
1997
+ codePoint & 0x3F | 0x80
1998
+ )
1999
+ } else if (codePoint < 0x10000) {
2000
+ if ((units -= 3) < 0) break
2001
+ bytes.push(
2002
+ codePoint >> 0xC | 0xE0,
2003
+ codePoint >> 0x6 & 0x3F | 0x80,
2004
+ codePoint & 0x3F | 0x80
2005
+ )
2006
+ } else if (codePoint < 0x110000) {
2007
+ if ((units -= 4) < 0) break
2008
+ bytes.push(
2009
+ codePoint >> 0x12 | 0xF0,
2010
+ codePoint >> 0xC & 0x3F | 0x80,
2011
+ codePoint >> 0x6 & 0x3F | 0x80,
2012
+ codePoint & 0x3F | 0x80
2013
+ )
2014
+ } else {
2015
+ throw new Error('Invalid code point')
2016
+ }
2017
+ }
2018
+
2019
+ return bytes
2020
+ }
2021
+
2022
+ function asciiToBytes (str) {
2023
+ var byteArray = []
2024
+ for (var i = 0; i < str.length; ++i) {
2025
+ // Node's code seems to be doing this and not & 0x7F..
2026
+ byteArray.push(str.charCodeAt(i) & 0xFF)
2027
+ }
2028
+ return byteArray
2029
+ }
2030
+
2031
+ function utf16leToBytes (str, units) {
2032
+ var c, hi, lo
2033
+ var byteArray = []
2034
+ for (var i = 0; i < str.length; ++i) {
2035
+ if ((units -= 2) < 0) break
2036
+
2037
+ c = str.charCodeAt(i)
2038
+ hi = c >> 8
2039
+ lo = c % 256
2040
+ byteArray.push(lo)
2041
+ byteArray.push(hi)
2042
+ }
2043
+
2044
+ return byteArray
2045
+ }
2046
+
2047
+ function base64ToBytes (str) {
2048
+ return base64.toByteArray(base64clean(str))
2049
+ }
2050
+
2051
+ function blitBuffer (src, dst, offset, length) {
2052
+ for (var i = 0; i < length; ++i) {
2053
+ if ((i + offset >= dst.length) || (i >= src.length)) break
2054
+ dst[i + offset] = src[i]
2055
+ }
2056
+ return i
2057
+ }
2058
+
2059
+ // ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
2060
+ // the `instanceof` check but they should be treated as of that type.
2061
+ // See: https://github.com/feross/buffer/issues/166
2062
+ function isInstance (obj, type) {
2063
+ return obj instanceof type ||
2064
+ (obj != null && obj.constructor != null && obj.constructor.name != null &&
2065
+ obj.constructor.name === type.name)
2066
+ }
2067
+ function numberIsNaN (obj) {
2068
+ // For IE11 support
2069
+ return obj !== obj // eslint-disable-line no-self-compare
2070
+ }
2071
+
2072
+ }).call(this)}).call(this,require("buffer").Buffer)
2073
+
2074
+ },{"base64-js":2,"buffer":3,"ieee754":4}],4:[function(require,module,exports){
2075
+ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
2076
+ exports.read = function (buffer, offset, isLE, mLen, nBytes) {
2077
+ var e, m
2078
+ var eLen = (nBytes * 8) - mLen - 1
2079
+ var eMax = (1 << eLen) - 1
2080
+ var eBias = eMax >> 1
2081
+ var nBits = -7
2082
+ var i = isLE ? (nBytes - 1) : 0
2083
+ var d = isLE ? -1 : 1
2084
+ var s = buffer[offset + i]
2085
+
2086
+ i += d
2087
+
2088
+ e = s & ((1 << (-nBits)) - 1)
2089
+ s >>= (-nBits)
2090
+ nBits += eLen
2091
+ for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
2092
+
2093
+ m = e & ((1 << (-nBits)) - 1)
2094
+ e >>= (-nBits)
2095
+ nBits += mLen
2096
+ for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
2097
+
2098
+ if (e === 0) {
2099
+ e = 1 - eBias
2100
+ } else if (e === eMax) {
2101
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
2102
+ } else {
2103
+ m = m + Math.pow(2, mLen)
2104
+ e = e - eBias
2105
+ }
2106
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
2107
+ }
2108
+
2109
+ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
2110
+ var e, m, c
2111
+ var eLen = (nBytes * 8) - mLen - 1
2112
+ var eMax = (1 << eLen) - 1
2113
+ var eBias = eMax >> 1
2114
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
2115
+ var i = isLE ? 0 : (nBytes - 1)
2116
+ var d = isLE ? 1 : -1
2117
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
2118
+
2119
+ value = Math.abs(value)
2120
+
2121
+ if (isNaN(value) || value === Infinity) {
2122
+ m = isNaN(value) ? 1 : 0
2123
+ e = eMax
2124
+ } else {
2125
+ e = Math.floor(Math.log(value) / Math.LN2)
2126
+ if (value * (c = Math.pow(2, -e)) < 1) {
2127
+ e--
2128
+ c *= 2
2129
+ }
2130
+ if (e + eBias >= 1) {
2131
+ value += rt / c
2132
+ } else {
2133
+ value += rt * Math.pow(2, 1 - eBias)
2134
+ }
2135
+ if (value * c >= 2) {
2136
+ e++
2137
+ c /= 2
2138
+ }
2139
+
2140
+ if (e + eBias >= eMax) {
2141
+ m = 0
2142
+ e = eMax
2143
+ } else if (e + eBias >= 1) {
2144
+ m = ((value * c) - 1) * Math.pow(2, mLen)
2145
+ e = e + eBias
2146
+ } else {
2147
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
2148
+ e = 0
2149
+ }
2150
+ }
2151
+
2152
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
2153
+
2154
+ e = (e << mLen) | m
2155
+ eLen += mLen
2156
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
2157
+
2158
+ buffer[offset + i - d] |= s * 128
2159
+ }
2160
+
2161
+ },{}],5:[function(require,module,exports){
2162
+ /////////////////////////////////////////////////////////////////////////////////
2163
+ /* UAParser.js v1.0.40
2164
+ Copyright © 2012-2024 Faisal Salman <f@faisalman.com>
2165
+ MIT License *//*
2166
+ Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.
2167
+ Supports browser & node.js environment.
2168
+ Demo : https://faisalman.github.io/ua-parser-js
2169
+ Source : https://github.com/faisalman/ua-parser-js */
2170
+ /////////////////////////////////////////////////////////////////////////////////
2171
+
2172
+ (function (window, undefined) {
2173
+
2174
+ 'use strict';
2175
+
2176
+ //////////////
2177
+ // Constants
2178
+ /////////////
2179
+
2180
+
2181
+ var LIBVERSION = '1.0.40',
2182
+ EMPTY = '',
2183
+ UNKNOWN = '?',
2184
+ FUNC_TYPE = 'function',
2185
+ UNDEF_TYPE = 'undefined',
2186
+ OBJ_TYPE = 'object',
2187
+ STR_TYPE = 'string',
2188
+ MAJOR = 'major',
2189
+ MODEL = 'model',
2190
+ NAME = 'name',
2191
+ TYPE = 'type',
2192
+ VENDOR = 'vendor',
2193
+ VERSION = 'version',
2194
+ ARCHITECTURE= 'architecture',
2195
+ CONSOLE = 'console',
2196
+ MOBILE = 'mobile',
2197
+ TABLET = 'tablet',
2198
+ SMARTTV = 'smarttv',
2199
+ WEARABLE = 'wearable',
2200
+ EMBEDDED = 'embedded',
2201
+ UA_MAX_LENGTH = 500;
2202
+
2203
+ var AMAZON = 'Amazon',
2204
+ APPLE = 'Apple',
2205
+ ASUS = 'ASUS',
2206
+ BLACKBERRY = 'BlackBerry',
2207
+ BROWSER = 'Browser',
2208
+ CHROME = 'Chrome',
2209
+ EDGE = 'Edge',
2210
+ FIREFOX = 'Firefox',
2211
+ GOOGLE = 'Google',
2212
+ HUAWEI = 'Huawei',
2213
+ LG = 'LG',
2214
+ MICROSOFT = 'Microsoft',
2215
+ MOTOROLA = 'Motorola',
2216
+ OPERA = 'Opera',
2217
+ SAMSUNG = 'Samsung',
2218
+ SHARP = 'Sharp',
2219
+ SONY = 'Sony',
2220
+ XIAOMI = 'Xiaomi',
2221
+ ZEBRA = 'Zebra',
2222
+ FACEBOOK = 'Facebook',
2223
+ CHROMIUM_OS = 'Chromium OS',
2224
+ MAC_OS = 'Mac OS',
2225
+ SUFFIX_BROWSER = ' Browser';
2226
+
2227
+ ///////////
2228
+ // Helper
2229
+ //////////
2230
+
2231
+ var extend = function (regexes, extensions) {
2232
+ var mergedRegexes = {};
2233
+ for (var i in regexes) {
2234
+ if (extensions[i] && extensions[i].length % 2 === 0) {
2235
+ mergedRegexes[i] = extensions[i].concat(regexes[i]);
2236
+ } else {
2237
+ mergedRegexes[i] = regexes[i];
2238
+ }
2239
+ }
2240
+ return mergedRegexes;
2241
+ },
2242
+ enumerize = function (arr) {
2243
+ var enums = {};
2244
+ for (var i=0; i<arr.length; i++) {
2245
+ enums[arr[i].toUpperCase()] = arr[i];
2246
+ }
2247
+ return enums;
2248
+ },
2249
+ has = function (str1, str2) {
2250
+ return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;
2251
+ },
2252
+ lowerize = function (str) {
2253
+ return str.toLowerCase();
2254
+ },
2255
+ majorize = function (version) {
2256
+ return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g, EMPTY).split('.')[0] : undefined;
2257
+ },
2258
+ trim = function (str, len) {
2259
+ if (typeof(str) === STR_TYPE) {
2260
+ str = str.replace(/^\s\s*/, EMPTY);
2261
+ return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);
2262
+ }
2263
+ };
2264
+
2265
+ ///////////////
2266
+ // Map helper
2267
+ //////////////
2268
+
2269
+ var rgxMapper = function (ua, arrays) {
2270
+
2271
+ var i = 0, j, k, p, q, matches, match;
2272
+
2273
+ // loop through all regexes maps
2274
+ while (i < arrays.length && !matches) {
2275
+
2276
+ var regex = arrays[i], // even sequence (0,2,4,..)
2277
+ props = arrays[i + 1]; // odd sequence (1,3,5,..)
2278
+ j = k = 0;
2279
+
2280
+ // try matching uastring with regexes
2281
+ while (j < regex.length && !matches) {
2282
+
2283
+ if (!regex[j]) { break; }
2284
+ matches = regex[j++].exec(ua);
2285
+
2286
+ if (!!matches) {
2287
+ for (p = 0; p < props.length; p++) {
2288
+ match = matches[++k];
2289
+ q = props[p];
2290
+ // check if given property is actually array
2291
+ if (typeof q === OBJ_TYPE && q.length > 0) {
2292
+ if (q.length === 2) {
2293
+ if (typeof q[1] == FUNC_TYPE) {
2294
+ // assign modified match
2295
+ this[q[0]] = q[1].call(this, match);
2296
+ } else {
2297
+ // assign given value, ignore regex match
2298
+ this[q[0]] = q[1];
2299
+ }
2300
+ } else if (q.length === 3) {
2301
+ // check whether function or regex
2302
+ if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {
2303
+ // call function (usually string mapper)
2304
+ this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;
2305
+ } else {
2306
+ // sanitize match using given regex
2307
+ this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;
2308
+ }
2309
+ } else if (q.length === 4) {
2310
+ this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;
2311
+ }
2312
+ } else {
2313
+ this[q] = match ? match : undefined;
2314
+ }
2315
+ }
2316
+ }
2317
+ }
2318
+ i += 2;
2319
+ }
2320
+ },
2321
+
2322
+ strMapper = function (str, map) {
2323
+
2324
+ for (var i in map) {
2325
+ // check if current value is array
2326
+ if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {
2327
+ for (var j = 0; j < map[i].length; j++) {
2328
+ if (has(map[i][j], str)) {
2329
+ return (i === UNKNOWN) ? undefined : i;
2330
+ }
2331
+ }
2332
+ } else if (has(map[i], str)) {
2333
+ return (i === UNKNOWN) ? undefined : i;
2334
+ }
2335
+ }
2336
+ return map.hasOwnProperty('*') ? map['*'] : str;
2337
+ };
2338
+
2339
+ ///////////////
2340
+ // String map
2341
+ //////////////
2342
+
2343
+ // Safari < 3.0
2344
+ var oldSafariMap = {
2345
+ '1.0' : '/8',
2346
+ '1.2' : '/1',
2347
+ '1.3' : '/3',
2348
+ '2.0' : '/412',
2349
+ '2.0.2' : '/416',
2350
+ '2.0.3' : '/417',
2351
+ '2.0.4' : '/419',
2352
+ '?' : '/'
2353
+ },
2354
+ windowsVersionMap = {
2355
+ 'ME' : '4.90',
2356
+ 'NT 3.11' : 'NT3.51',
2357
+ 'NT 4.0' : 'NT4.0',
2358
+ '2000' : 'NT 5.0',
2359
+ 'XP' : ['NT 5.1', 'NT 5.2'],
2360
+ 'Vista' : 'NT 6.0',
2361
+ '7' : 'NT 6.1',
2362
+ '8' : 'NT 6.2',
2363
+ '8.1' : 'NT 6.3',
2364
+ '10' : ['NT 6.4', 'NT 10.0'],
2365
+ 'RT' : 'ARM'
2366
+ };
2367
+
2368
+ //////////////
2369
+ // Regex map
2370
+ /////////////
2371
+
2372
+ var regexes = {
2373
+
2374
+ browser : [[
2375
+
2376
+ /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS
2377
+ ], [VERSION, [NAME, 'Chrome']], [
2378
+ /edg(?:e|ios|a)?\/([\w\.]+)/i // Microsoft Edge
2379
+ ], [VERSION, [NAME, 'Edge']], [
2380
+
2381
+ // Presto based
2382
+ /(opera mini)\/([-\w\.]+)/i, // Opera Mini
2383
+ /(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i, // Opera Mobi/Tablet
2384
+ /(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i // Opera
2385
+ ], [NAME, VERSION], [
2386
+ /opios[\/ ]+([\w\.]+)/i // Opera mini on iphone >= 8.0
2387
+ ], [VERSION, [NAME, OPERA+' Mini']], [
2388
+ /\bop(?:rg)?x\/([\w\.]+)/i // Opera GX
2389
+ ], [VERSION, [NAME, OPERA+' GX']], [
2390
+ /\bopr\/([\w\.]+)/i // Opera Webkit
2391
+ ], [VERSION, [NAME, OPERA]], [
2392
+
2393
+ // Mixed
2394
+ /\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i // Baidu
2395
+ ], [VERSION, [NAME, 'Baidu']], [
2396
+ /\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i // Maxthon
2397
+ ], [VERSION, [NAME, 'Maxthon']], [
2398
+ /(kindle)\/([\w\.]+)/i, // Kindle
2399
+ /(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
2400
+ // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
2401
+ // Trident based
2402
+ /(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i, // Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
2403
+ /(?:ms|\()(ie) ([\w\.]+)/i, // Internet Explorer
2404
+
2405
+ // Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon
2406
+ /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon)\/([-\w\.]+)/i,
2407
+ // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
2408
+ /(heytap|ovi|115)browser\/([\d\.]+)/i, // HeyTap/Ovi/115
2409
+ /(weibo)__([\d\.]+)/i // Weibo
2410
+ ], [NAME, VERSION], [
2411
+ /quark(?:pc)?\/([-\w\.]+)/i // Quark
2412
+ ], [VERSION, [NAME, 'Quark']], [
2413
+ /\bddg\/([\w\.]+)/i // DuckDuckGo
2414
+ ], [VERSION, [NAME, 'DuckDuckGo']], [
2415
+ /(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i // UCBrowser
2416
+ ], [VERSION, [NAME, 'UC'+BROWSER]], [
2417
+ /microm.+\bqbcore\/([\w\.]+)/i, // WeChat Desktop for Windows Built-in Browser
2418
+ /\bqbcore\/([\w\.]+).+microm/i,
2419
+ /micromessenger\/([\w\.]+)/i // WeChat
2420
+ ], [VERSION, [NAME, 'WeChat']], [
2421
+ /konqueror\/([\w\.]+)/i // Konqueror
2422
+ ], [VERSION, [NAME, 'Konqueror']], [
2423
+ /trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i // IE11
2424
+ ], [VERSION, [NAME, 'IE']], [
2425
+ /ya(?:search)?browser\/([\w\.]+)/i // Yandex
2426
+ ], [VERSION, [NAME, 'Yandex']], [
2427
+ /slbrowser\/([\w\.]+)/i // Smart Lenovo Browser
2428
+ ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [
2429
+ /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser
2430
+ ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [
2431
+ /\bfocus\/([\w\.]+)/i // Firefox Focus
2432
+ ], [VERSION, [NAME, FIREFOX+' Focus']], [
2433
+ /\bopt\/([\w\.]+)/i // Opera Touch
2434
+ ], [VERSION, [NAME, OPERA+' Touch']], [
2435
+ /coc_coc\w+\/([\w\.]+)/i // Coc Coc Browser
2436
+ ], [VERSION, [NAME, 'Coc Coc']], [
2437
+ /dolfin\/([\w\.]+)/i // Dolphin
2438
+ ], [VERSION, [NAME, 'Dolphin']], [
2439
+ /coast\/([\w\.]+)/i // Opera Coast
2440
+ ], [VERSION, [NAME, OPERA+' Coast']], [
2441
+ /miuibrowser\/([\w\.]+)/i // MIUI Browser
2442
+ ], [VERSION, [NAME, 'MIUI' + SUFFIX_BROWSER]], [
2443
+ /fxios\/([\w\.-]+)/i // Firefox for iOS
2444
+ ], [VERSION, [NAME, FIREFOX]], [
2445
+ /\bqihoobrowser\/?([\w\.]*)/i // 360
2446
+ ], [VERSION, [NAME, '360']], [
2447
+ /\b(qq)\/([\w\.]+)/i // QQ
2448
+ ], [[NAME, /(.+)/, '$1Browser'], VERSION], [
2449
+ /(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
2450
+ ], [[NAME, /(.+)/, '$1' + SUFFIX_BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
2451
+ /samsungbrowser\/([\w\.]+)/i // Samsung Internet
2452
+ ], [VERSION, [NAME, SAMSUNG + ' Internet']], [
2453
+ /metasr[\/ ]?([\d\.]+)/i // Sogou Explorer
2454
+ ], [VERSION, [NAME, 'Sogou Explorer']], [
2455
+ /(sogou)mo\w+\/([\d\.]+)/i // Sogou Mobile
2456
+ ], [[NAME, 'Sogou Mobile'], VERSION], [
2457
+ /(electron)\/([\w\.]+) safari/i, // Electron-based App
2458
+ /(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i, // Tesla
2459
+ /m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i // QQ/2345
2460
+ ], [NAME, VERSION], [
2461
+ /(lbbrowser|rekonq)/i, // LieBao Browser/Rekonq
2462
+ /\[(linkedin)app\]/i // LinkedIn App for iOS & Android
2463
+ ], [NAME], [
2464
+ /ome\/([\w\.]+) \w* ?(iron) saf/i, // Iron
2465
+ /ome\/([\w\.]+).+qihu (360)[es]e/i // 360
2466
+ ], [VERSION, NAME], [
2467
+
2468
+ // WebView
2469
+ /((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i // Facebook App for iOS & Android
2470
+ ], [[NAME, FACEBOOK], VERSION], [
2471
+ /(Klarna)\/([\w\.]+)/i, // Klarna Shopping Browser for iOS & Android
2472
+ /(kakao(?:talk|story))[\/ ]([\w\.]+)/i, // Kakao App
2473
+ /(naver)\(.*?(\d+\.[\w\.]+).*\)/i, // Naver InApp
2474
+ /safari (line)\/([\w\.]+)/i, // Line App for iOS
2475
+ /\b(line)\/([\w\.]+)\/iab/i, // Line App for Android
2476
+ /(alipay)client\/([\w\.]+)/i, // Alipay
2477
+ /(twitter)(?:and| f.+e\/([\w\.]+))/i, // Twitter
2478
+ /(chromium|instagram|snapchat)[\/ ]([-\w\.]+)/i // Chromium/Instagram/Snapchat
2479
+ ], [NAME, VERSION], [
2480
+ /\bgsa\/([\w\.]+) .*safari\//i // Google Search Appliance on iOS
2481
+ ], [VERSION, [NAME, 'GSA']], [
2482
+ /musical_ly(?:.+app_?version\/|_)([\w\.]+)/i // TikTok
2483
+ ], [VERSION, [NAME, 'TikTok']], [
2484
+
2485
+ /headlesschrome(?:\/([\w\.]+)| )/i // Chrome Headless
2486
+ ], [VERSION, [NAME, CHROME+' Headless']], [
2487
+
2488
+ / wv\).+(chrome)\/([\w\.]+)/i // Chrome WebView
2489
+ ], [[NAME, CHROME+' WebView'], VERSION], [
2490
+
2491
+ /droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i // Android Browser
2492
+ ], [VERSION, [NAME, 'Android '+BROWSER]], [
2493
+
2494
+ /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia
2495
+ ], [NAME, VERSION], [
2496
+
2497
+ /version\/([\w\.\,]+) .*mobile\/\w+ (safari)/i // Mobile Safari
2498
+ ], [VERSION, [NAME, 'Mobile Safari']], [
2499
+ /version\/([\w(\.|\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile
2500
+ ], [VERSION, NAME], [
2501
+ /webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i // Safari < 3.0
2502
+ ], [NAME, [VERSION, strMapper, oldSafariMap]], [
2503
+
2504
+ /(webkit|khtml)\/([\w\.]+)/i
2505
+ ], [NAME, VERSION], [
2506
+
2507
+ // Gecko based
2508
+ /(navigator|netscape\d?)\/([-\w\.]+)/i // Netscape
2509
+ ], [[NAME, 'Netscape'], VERSION], [
2510
+ /(wolvic|librewolf)\/([\w\.]+)/i // Wolvic/LibreWolf
2511
+ ], [NAME, VERSION], [
2512
+ /mobile vr; rv:([\w\.]+)\).+firefox/i // Firefox Reality
2513
+ ], [VERSION, [NAME, FIREFOX+' Reality']], [
2514
+ /ekiohf.+(flow)\/([\w\.]+)/i, // Flow
2515
+ /(swiftfox)/i, // Swiftfox
2516
+ /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
2517
+ // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
2518
+ /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([-\w\.]+)$/i,
2519
+ // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
2520
+ /(firefox)\/([\w\.]+)/i, // Other Firefox-based
2521
+ /(mozilla)\/([\w\.]+) .+rv\:.+gecko\/\d+/i, // Mozilla
2522
+
2523
+ // Other
2524
+ /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|obigo|mosaic|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
2525
+ // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser
2526
+ /(links) \(([\w\.]+)/i // Links
2527
+ ], [NAME, [VERSION, /_/g, '.']], [
2528
+
2529
+ /(cobalt)\/([\w\.]+)/i // Cobalt
2530
+ ], [NAME, [VERSION, /master.|lts./, ""]]
2531
+ ],
2532
+
2533
+ cpu : [[
2534
+
2535
+ /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\)]/i // AMD64 (x64)
2536
+ ], [[ARCHITECTURE, 'amd64']], [
2537
+
2538
+ /(ia32(?=;))/i // IA32 (quicktime)
2539
+ ], [[ARCHITECTURE, lowerize]], [
2540
+
2541
+ /((?:i[346]|x)86)[;\)]/i // IA32 (x86)
2542
+ ], [[ARCHITECTURE, 'ia32']], [
2543
+
2544
+ /\b(aarch64|arm(v?8e?l?|_?64))\b/i // ARM64
2545
+ ], [[ARCHITECTURE, 'arm64']], [
2546
+
2547
+ /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF
2548
+ ], [[ARCHITECTURE, 'armhf']], [
2549
+
2550
+ // PocketPC mistakenly identified as PowerPC
2551
+ /windows (ce|mobile); ppc;/i
2552
+ ], [[ARCHITECTURE, 'arm']], [
2553
+
2554
+ /((?:ppc|powerpc)(?:64)?)(?: mac|;|\))/i // PowerPC
2555
+ ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [
2556
+
2557
+ /(sun4\w)[;\)]/i // SPARC
2558
+ ], [[ARCHITECTURE, 'sparc']], [
2559
+
2560
+ /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i
2561
+ // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
2562
+ ], [[ARCHITECTURE, lowerize]]
2563
+ ],
2564
+
2565
+ device : [[
2566
+
2567
+ //////////////////////////
2568
+ // MOBILES & TABLETS
2569
+ /////////////////////////
2570
+
2571
+ // Samsung
2572
+ /\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
2573
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [
2574
+ /\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
2575
+ /samsung[- ]((?!sm-[lr])[-\w]+)/i,
2576
+ /sec-(sgh\w+)/i
2577
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [
2578
+
2579
+ // Apple
2580
+ /(?:\/|\()(ip(?:hone|od)[\w, ]*)(?:\/|;)/i // iPod/iPhone
2581
+ ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [
2582
+ /\((ipad);[-\w\),; ]+apple/i, // iPad
2583
+ /applecoremedia\/[\w\.]+ \((ipad)/i,
2584
+ /\b(ipad)\d\d?,\d\d?[;\]].+ios/i
2585
+ ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [
2586
+ /(macintosh);/i
2587
+ ], [MODEL, [VENDOR, APPLE]], [
2588
+
2589
+ // Sharp
2590
+ /\b(sh-?[altvz]?\d\d[a-ekm]?)/i
2591
+ ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [
2592
+
2593
+ // Honor
2594
+ /(?:honor)([-\w ]+)[;\)]/i
2595
+ ], [MODEL, [VENDOR, 'Honor'], [TYPE, MOBILE]], [
2596
+
2597
+ // Huawei
2598
+ /\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\d{2})\b(?!.+d\/s)/i
2599
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [
2600
+ /(?:huawei)([-\w ]+)[;\)]/i,
2601
+ /\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][012359c][adn]?)\b(?!.+d\/s)/i
2602
+ ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [
2603
+
2604
+ // Xiaomi
2605
+ /\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i, // Xiaomi POCO
2606
+ /\b; (\w+) build\/hm\1/i, // Xiaomi Hongmi 'numeric' models
2607
+ /\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i, // Xiaomi Hongmi
2608
+ /\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i, // Xiaomi Redmi
2609
+ /oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i, // Xiaomi Redmi 'numeric' models
2610
+ /\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\d?\w?)[_ ]?(?:plus|se|lite|pro)?)(?: bui|\))/i // Xiaomi Mi
2611
+ ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [
2612
+ /oid[^\)]+; (2\d{4}(283|rpbf)[cgl])( bui|\))/i, // Redmi Pad
2613
+ /\b(mi[-_ ]?(?:pad)(?:[\w_ ]+))(?: bui|\))/i // Mi Pad tablets
2614
+ ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [
2615
+
2616
+ // OPPO
2617
+ /; (\w+) bui.+ oppo/i,
2618
+ /\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
2619
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [
2620
+ /\b(opd2\d{3}a?) bui/i
2621
+ ], [MODEL, [VENDOR, 'OPPO'], [TYPE, TABLET]], [
2622
+
2623
+ // Vivo
2624
+ /vivo (\w+)(?: bui|\))/i,
2625
+ /\b(v[12]\d{3}\w?[at])(?: bui|;)/i
2626
+ ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [
2627
+
2628
+ // Realme
2629
+ /\b(rmx[1-3]\d{3})(?: bui|;|\))/i
2630
+ ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [
2631
+
2632
+ // Motorola
2633
+ /\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
2634
+ /\bmot(?:orola)?[- ](\w*)/i,
2635
+ /((?:moto[\w\(\) ]+|xt\d{3,4}|nexus 6)(?= bui|\)))/i
2636
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [
2637
+ /\b(mz60\d|xoom[2 ]{0,2}) build\//i
2638
+ ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [
2639
+
2640
+ // LG
2641
+ /((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
2642
+ ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [
2643
+ /(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
2644
+ /\blg[-e;\/ ]+((?!browser|netcast|android tv)\w+)/i,
2645
+ /\blg-?([\d\w]+) bui/i
2646
+ ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [
2647
+
2648
+ // Lenovo
2649
+ /(ideatab[-\w ]+)/i,
2650
+ /lenovo ?(s[56]000[-\w]+|tab(?:[\w ]+)|yt[-\d\w]{6}|tb[-\d\w]{6})/i
2651
+ ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [
2652
+
2653
+ // Nokia
2654
+ /(?:maemo|nokia).*(n900|lumia \d+)/i,
2655
+ /nokia[-_ ]?([-\w\.]*)/i
2656
+ ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [
2657
+
2658
+ // Google
2659
+ /(pixel c)\b/i // Google Pixel C
2660
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [
2661
+ /droid.+; (pixel[\daxl ]{0,6})(?: bui|\))/i // Google Pixel
2662
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [
2663
+
2664
+ // Sony
2665
+ /droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-a\w[4-7][12])(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
2666
+ ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [
2667
+ /sony tablet [ps]/i,
2668
+ /\b(?:sony)?sgp\w+(?: bui|\))/i
2669
+ ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [
2670
+
2671
+ // OnePlus
2672
+ / (kb2005|in20[12]5|be20[12][59])\b/i,
2673
+ /(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
2674
+ ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [
2675
+
2676
+ // Amazon
2677
+ /(alexa)webm/i,
2678
+ /(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i, // Kindle Fire without Silk / Echo Show
2679
+ /(kf[a-z]+)( bui|\)).+silk\//i // Kindle Fire HD
2680
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [
2681
+ /((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i // Fire Phone
2682
+ ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [
2683
+
2684
+ // BlackBerry
2685
+ /(playbook);[-\w\),; ]+(rim)/i // BlackBerry PlayBook
2686
+ ], [MODEL, VENDOR, [TYPE, TABLET]], [
2687
+ /\b((?:bb[a-f]|st[hv])100-\d)/i,
2688
+ /\(bb10; (\w+)/i // BlackBerry 10
2689
+ ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [
2690
+
2691
+ // Asus
2692
+ /(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
2693
+ ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [
2694
+ / (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
2695
+ ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [
2696
+
2697
+ // HTC
2698
+ /(nexus 9)/i // HTC Nexus 9
2699
+ ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [
2700
+ /(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i, // HTC
2701
+
2702
+ // ZTE
2703
+ /(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
2704
+ /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony
2705
+ ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [
2706
+
2707
+ // TCL
2708
+ /droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])\w*(\)| bui)/i
2709
+ ], [MODEL, [VENDOR, 'TCL'], [TYPE, TABLET]], [
2710
+
2711
+ // itel
2712
+ /(itel) ((\w+))/i
2713
+ ], [[VENDOR, lowerize], MODEL, [TYPE, strMapper, { 'tablet' : ['p10001l', 'w7001'], '*' : 'mobile' }]], [
2714
+
2715
+ // Acer
2716
+ /droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
2717
+ ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [
2718
+
2719
+ // Meizu
2720
+ /droid.+; (m[1-5] note) bui/i,
2721
+ /\bmz-([-\w]{2,})/i
2722
+ ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [
2723
+
2724
+ // Ulefone
2725
+ /; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
2726
+ ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [
2727
+
2728
+ // Energizer
2729
+ /; (energy ?\w+)(?: bui|\))/i,
2730
+ /; energizer ([\w ]+)(?: bui|\))/i
2731
+ ], [MODEL, [VENDOR, 'Energizer'], [TYPE, MOBILE]], [
2732
+
2733
+ // Cat
2734
+ /; cat (b35);/i,
2735
+ /; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
2736
+ ], [MODEL, [VENDOR, 'Cat'], [TYPE, MOBILE]], [
2737
+
2738
+ // Smartfren
2739
+ /((?:new )?andromax[\w- ]+)(?: bui|\))/i
2740
+ ], [MODEL, [VENDOR, 'Smartfren'], [TYPE, MOBILE]], [
2741
+
2742
+ // Nothing
2743
+ /droid.+; (a(?:015|06[35]|142p?))/i
2744
+ ], [MODEL, [VENDOR, 'Nothing'], [TYPE, MOBILE]], [
2745
+
2746
+ // MIXED
2747
+ /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
2748
+ // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Infinix/Tecno/Micromax/Advan
2749
+ /; (imo) ((?!tab)[\w ]+?)(?: bui|\))/i, // IMO
2750
+ /(hp) ([\w ]+\w)/i, // HP iPAQ
2751
+ /(asus)-?(\w+)/i, // Asus
2752
+ /(microsoft); (lumia[\w ]+)/i, // Microsoft Lumia
2753
+ /(lenovo)[-_ ]?([-\w]+)/i, // Lenovo
2754
+ /(jolla)/i, // Jolla
2755
+ /(oppo) ?([\w ]+) bui/i // OPPO
2756
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
2757
+
2758
+ /(imo) (tab \w+)/i, // IMO
2759
+ /(kobo)\s(ereader|touch)/i, // Kobo
2760
+ /(archos) (gamepad2?)/i, // Archos
2761
+ /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad
2762
+ /(kindle)\/([\w\.]+)/i, // Kindle
2763
+ /(nook)[\w ]+build\/(\w+)/i, // Nook
2764
+ /(dell) (strea[kpr\d ]*[\dko])/i, // Dell Streak
2765
+ /(le[- ]+pan)[- ]+(\w{1,9}) bui/i, // Le Pan Tablets
2766
+ /(trinity)[- ]*(t\d{3}) bui/i, // Trinity Tablets
2767
+ /(gigaset)[- ]+(q\w{1,9}) bui/i, // Gigaset Tablets
2768
+ /(vodafone) ([\w ]+)(?:\)| bui)/i // Vodafone
2769
+ ], [VENDOR, MODEL, [TYPE, TABLET]], [
2770
+
2771
+ /(surface duo)/i // Surface Duo
2772
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [
2773
+ /droid [\d\.]+; (fp\du?)(?: b|\))/i // Fairphone
2774
+ ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [
2775
+ /(u304aa)/i // AT&T
2776
+ ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [
2777
+ /\bsie-(\w*)/i // Siemens
2778
+ ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [
2779
+ /\b(rct\w+) b/i // RCA Tablets
2780
+ ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [
2781
+ /\b(venue[\d ]{2,7}) b/i // Dell Venue Tablets
2782
+ ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [
2783
+ /\b(q(?:mv|ta)\w+) b/i // Verizon Tablet
2784
+ ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [
2785
+ /\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i // Barnes & Noble Tablet
2786
+ ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [
2787
+ /\b(tm\d{3}\w+) b/i
2788
+ ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [
2789
+ /\b(k88) b/i // ZTE K Series Tablet
2790
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [
2791
+ /\b(nx\d{3}j) b/i // ZTE Nubia
2792
+ ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [
2793
+ /\b(gen\d{3}) b.+49h/i // Swiss GEN Mobile
2794
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [
2795
+ /\b(zur\d{3}) b/i // Swiss ZUR Tablet
2796
+ ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [
2797
+ /\b((zeki)?tb.*\b) b/i // Zeki Tablets
2798
+ ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [
2799
+ /\b([yr]\d{2}) b/i,
2800
+ /\b(dragon[- ]+touch |dt)(\w{5}) b/i // Dragon Touch Tablet
2801
+ ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [
2802
+ /\b(ns-?\w{0,9}) b/i // Insignia Tablets
2803
+ ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [
2804
+ /\b((nxa|next)-?\w{0,9}) b/i // NextBook Tablets
2805
+ ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [
2806
+ /\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones
2807
+ ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [
2808
+ /\b(lvtel\-)?(v1[12]) b/i // LvTel Phones
2809
+ ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [
2810
+ /\b(ph-1) /i // Essential PH-1
2811
+ ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [
2812
+ /\b(v(100md|700na|7011|917g).*\b) b/i // Envizen Tablets
2813
+ ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [
2814
+ /\b(trio[-\w\. ]+) b/i // MachSpeed Tablets
2815
+ ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [
2816
+ /\btu_(1491) b/i // Rotor Tablets
2817
+ ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [
2818
+ /(shield[\w ]+) b/i // Nvidia Shield Tablets
2819
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [
2820
+ /(sprint) (\w+)/i // Sprint Phones
2821
+ ], [VENDOR, MODEL, [TYPE, MOBILE]], [
2822
+ /(kin\.[onetw]{3})/i // Microsoft Kin
2823
+ ], [[MODEL, /\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [
2824
+ /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra
2825
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [
2826
+ /droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
2827
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [
2828
+
2829
+ ///////////////////
2830
+ // SMARTTVS
2831
+ ///////////////////
2832
+
2833
+ /smart-tv.+(samsung)/i // Samsung
2834
+ ], [VENDOR, [TYPE, SMARTTV]], [
2835
+ /hbbtv.+maple;(\d+)/i
2836
+ ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [
2837
+ /(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i // LG SmartTV
2838
+ ], [[VENDOR, LG], [TYPE, SMARTTV]], [
2839
+ /(apple) ?tv/i // Apple TV
2840
+ ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [
2841
+ /crkey/i // Google Chromecast
2842
+ ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [
2843
+ /droid.+aft(\w+)( bui|\))/i // Fire TV
2844
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [
2845
+ /\(dtv[\);].+(aquos)/i,
2846
+ /(aquos-tv[\w ]+)\)/i // Sharp
2847
+ ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[
2848
+ /(bravia[\w ]+)( bui|\))/i // Sony
2849
+ ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [
2850
+ /(mitv-\w{5}) bui/i // Xiaomi
2851
+ ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [
2852
+ /Hbbtv.*(technisat) (.*);/i // TechniSAT
2853
+ ], [VENDOR, MODEL, [TYPE, SMARTTV]], [
2854
+ /\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i, // Roku
2855
+ /hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i // HbbTV devices
2856
+ ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [
2857
+ /\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\b/i // SmartTV from Unidentified Vendors
2858
+ ], [[TYPE, SMARTTV]], [
2859
+
2860
+ ///////////////////
2861
+ // CONSOLES
2862
+ ///////////////////
2863
+
2864
+ /(ouya)/i, // Ouya
2865
+ /(nintendo) ([wids3utch]+)/i // Nintendo
2866
+ ], [VENDOR, MODEL, [TYPE, CONSOLE]], [
2867
+ /droid.+; (shield) bui/i // Nvidia
2868
+ ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [
2869
+ /(playstation [345portablevi]+)/i // Playstation
2870
+ ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [
2871
+ /\b(xbox(?: one)?(?!; xbox))[\); ]/i // Microsoft Xbox
2872
+ ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [
2873
+
2874
+ ///////////////////
2875
+ // WEARABLES
2876
+ ///////////////////
2877
+
2878
+ /\b(sm-[lr]\d\d[05][fnuw]?s?)\b/i // Samsung Galaxy Watch
2879
+ ], [MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]], [
2880
+ /((pebble))app/i // Pebble
2881
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
2882
+ /(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i // Apple Watch
2883
+ ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [
2884
+ /droid.+; (glass) \d/i // Google Glass
2885
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
2886
+ /droid.+; (wt63?0{2,3})\)/i
2887
+ ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [
2888
+
2889
+ ///////////////////
2890
+ // XR
2891
+ ///////////////////
2892
+
2893
+ /droid.+; (glass) \d/i // Google Glass
2894
+ ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [
2895
+ /(pico) (4|neo3(?: link|pro)?)/i // Pico
2896
+ ], [VENDOR, MODEL, [TYPE, WEARABLE]], [
2897
+ /; (quest( \d| pro)?)/i // Oculus Quest
2898
+ ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [
2899
+
2900
+ ///////////////////
2901
+ // EMBEDDED
2902
+ ///////////////////
2903
+
2904
+ /(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i // Tesla
2905
+ ], [VENDOR, [TYPE, EMBEDDED]], [
2906
+ /(aeobc)\b/i // Echo Dot
2907
+ ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [
2908
+
2909
+ ////////////////////
2910
+ // MIXED (GENERIC)
2911
+ ///////////////////
2912
+
2913
+ /droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors
2914
+ ], [MODEL, [TYPE, MOBILE]], [
2915
+ /droid .+?; ([^;]+?)(?: bui|\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors
2916
+ ], [MODEL, [TYPE, TABLET]], [
2917
+ /\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i // Unidentifiable Tablet
2918
+ ], [[TYPE, TABLET]], [
2919
+ /(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile
2920
+ ], [[TYPE, MOBILE]], [
2921
+ /(android[-\w\. ]{0,9});.+buil/i // Generic Android Device
2922
+ ], [MODEL, [VENDOR, 'Generic']]
2923
+ ],
2924
+
2925
+ engine : [[
2926
+
2927
+ /windows.+ edge\/([\w\.]+)/i // EdgeHTML
2928
+ ], [VERSION, [NAME, EDGE+'HTML']], [
2929
+
2930
+ /(arkweb)\/([\w\.]+)/i // ArkWeb
2931
+ ], [NAME, VERSION], [
2932
+
2933
+ /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink
2934
+ ], [VERSION, [NAME, 'Blink']], [
2935
+
2936
+ /(presto)\/([\w\.]+)/i, // Presto
2937
+ /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
2938
+ /ekioh(flow)\/([\w\.]+)/i, // Flow
2939
+ /(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i, // KHTML/Tasman/Links
2940
+ /(icab)[\/ ]([23]\.[\d\.]+)/i, // iCab
2941
+ /\b(libweb)/i
2942
+ ], [NAME, VERSION], [
2943
+
2944
+ /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko
2945
+ ], [VERSION, NAME]
2946
+ ],
2947
+
2948
+ os : [[
2949
+
2950
+ // Windows
2951
+ /microsoft (windows) (vista|xp)/i // Windows (iTunes)
2952
+ ], [NAME, VERSION], [
2953
+ /(windows (?:phone(?: os)?|mobile))[\/ ]?([\d\.\w ]*)/i // Windows Phone
2954
+ ], [NAME, [VERSION, strMapper, windowsVersionMap]], [
2955
+ /windows nt 6\.2; (arm)/i, // Windows RT
2956
+ /windows[\/ ]?([ntce\d\. ]+\w)(?!.+xbox)/i,
2957
+ /(?:win(?=3|9|n)|win 9x )([nt\d\.]+)/i
2958
+ ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [
2959
+
2960
+ // iOS/macOS
2961
+ /ip[honead]{2,4}\b(?:.*os ([\w]+) like mac|; opera)/i, // iOS
2962
+ /(?:ios;fbsv\/|iphone.+ios[\/ ])([\d\.]+)/i,
2963
+ /cfnetwork\/.+darwin/i
2964
+ ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [
2965
+ /(mac os x) ?([\w\. ]*)/i,
2966
+ /(macintosh|mac_powerpc\b)(?!.+haiku)/i // Mac OS
2967
+ ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [
2968
+
2969
+ // Mobile OSes
2970
+ /droid ([\w\.]+)\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS
2971
+ ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS/OpenHarmony
2972
+ /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish|openharmony)[-\/ ]?([\w\.]*)/i,
2973
+ /(blackberry)\w*\/([\w\.]*)/i, // Blackberry
2974
+ /(tizen|kaios)[\/ ]([\w\.]+)/i, // Tizen/KaiOS
2975
+ /\((series40);/i // Series 40
2976
+ ], [NAME, VERSION], [
2977
+ /\(bb(10);/i // BlackBerry 10
2978
+ ], [VERSION, [NAME, BLACKBERRY]], [
2979
+ /(?:symbian ?os|symbos|s60(?=;)|series60)[-\/ ]?([\w\.]*)/i // Symbian
2980
+ ], [VERSION, [NAME, 'Symbian']], [
2981
+ /mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i // Firefox OS
2982
+ ], [VERSION, [NAME, FIREFOX+' OS']], [
2983
+ /web0s;.+rt(tv)/i,
2984
+ /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS
2985
+ ], [VERSION, [NAME, 'webOS']], [
2986
+ /watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i // watchOS
2987
+ ], [VERSION, [NAME, 'watchOS']], [
2988
+
2989
+ // Google Chromecast
2990
+ /crkey\/([\d\.]+)/i // Google Chromecast
2991
+ ], [VERSION, [NAME, CHROME+'cast']], [
2992
+ /(cros) [\w]+(?:\)| ([\w\.]+)\b)/i // Chromium OS
2993
+ ], [[NAME, CHROMIUM_OS], VERSION],[
2994
+
2995
+ // Smart TVs
2996
+ /panasonic;(viera)/i, // Panasonic Viera
2997
+ /(netrange)mmh/i, // Netrange
2998
+ /(nettv)\/(\d+\.[\w\.]+)/i, // NetTV
2999
+
3000
+ // Console
3001
+ /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation
3002
+ /(xbox); +xbox ([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)
3003
+
3004
+ // Other
3005
+ /\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i, // Joli/Palm
3006
+ /(mint)[\/\(\) ]?(\w*)/i, // Mint
3007
+ /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux
3008
+ /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
3009
+ // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire
3010
+ /(hurd|linux) ?([\w\.]*)/i, // Hurd/Linux
3011
+ /(gnu) ?([\w\.]*)/i, // GNU
3012
+ /\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
3013
+ /(haiku) (\w+)/i // Haiku
3014
+ ], [NAME, VERSION], [
3015
+ /(sunos) ?([\w\.\d]*)/i // Solaris
3016
+ ], [[NAME, 'Solaris'], VERSION], [
3017
+ /((?:open)?solaris)[-\/ ]?([\w\.]*)/i, // Solaris
3018
+ /(aix) ((\d)(?=\.|\)| )[\w\.])*/i, // AIX
3019
+ /\b(beos|os\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS
3020
+ /(unix) ?([\w\.]*)/i // UNIX
3021
+ ], [NAME, VERSION]
3022
+ ]
3023
+ };
3024
+
3025
+ /////////////////
3026
+ // Constructor
3027
+ ////////////////
3028
+
3029
+ var UAParser = function (ua, extensions) {
3030
+
3031
+ if (typeof ua === OBJ_TYPE) {
3032
+ extensions = ua;
3033
+ ua = undefined;
3034
+ }
3035
+
3036
+ if (!(this instanceof UAParser)) {
3037
+ return new UAParser(ua, extensions).getResult();
3038
+ }
3039
+
3040
+ var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;
3041
+ var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);
3042
+ var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;
3043
+ var _rgxmap = extensions ? extend(regexes, extensions) : regexes;
3044
+ var _isSelfNav = _navigator && _navigator.userAgent == _ua;
3045
+
3046
+ this.getBrowser = function () {
3047
+ var _browser = {};
3048
+ _browser[NAME] = undefined;
3049
+ _browser[VERSION] = undefined;
3050
+ rgxMapper.call(_browser, _ua, _rgxmap.browser);
3051
+ _browser[MAJOR] = majorize(_browser[VERSION]);
3052
+ // Brave-specific detection
3053
+ if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {
3054
+ _browser[NAME] = 'Brave';
3055
+ }
3056
+ return _browser;
3057
+ };
3058
+ this.getCPU = function () {
3059
+ var _cpu = {};
3060
+ _cpu[ARCHITECTURE] = undefined;
3061
+ rgxMapper.call(_cpu, _ua, _rgxmap.cpu);
3062
+ return _cpu;
3063
+ };
3064
+ this.getDevice = function () {
3065
+ var _device = {};
3066
+ _device[VENDOR] = undefined;
3067
+ _device[MODEL] = undefined;
3068
+ _device[TYPE] = undefined;
3069
+ rgxMapper.call(_device, _ua, _rgxmap.device);
3070
+ if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {
3071
+ _device[TYPE] = MOBILE;
3072
+ }
3073
+ // iPadOS-specific detection: identified as Mac, but has some iOS-only properties
3074
+ if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {
3075
+ _device[MODEL] = 'iPad';
3076
+ _device[TYPE] = TABLET;
3077
+ }
3078
+ return _device;
3079
+ };
3080
+ this.getEngine = function () {
3081
+ var _engine = {};
3082
+ _engine[NAME] = undefined;
3083
+ _engine[VERSION] = undefined;
3084
+ rgxMapper.call(_engine, _ua, _rgxmap.engine);
3085
+ return _engine;
3086
+ };
3087
+ this.getOS = function () {
3088
+ var _os = {};
3089
+ _os[NAME] = undefined;
3090
+ _os[VERSION] = undefined;
3091
+ rgxMapper.call(_os, _ua, _rgxmap.os);
3092
+ if (_isSelfNav && !_os[NAME] && _uach && _uach.platform && _uach.platform != 'Unknown') {
3093
+ _os[NAME] = _uach.platform
3094
+ .replace(/chrome os/i, CHROMIUM_OS)
3095
+ .replace(/macos/i, MAC_OS); // backward compatibility
3096
+ }
3097
+ return _os;
3098
+ };
3099
+ this.getResult = function () {
3100
+ return {
3101
+ ua : this.getUA(),
3102
+ browser : this.getBrowser(),
3103
+ engine : this.getEngine(),
3104
+ os : this.getOS(),
3105
+ device : this.getDevice(),
3106
+ cpu : this.getCPU()
3107
+ };
3108
+ };
3109
+ this.getUA = function () {
3110
+ return _ua;
3111
+ };
3112
+ this.setUA = function (ua) {
3113
+ _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;
3114
+ return this;
3115
+ };
3116
+ this.setUA(_ua);
3117
+ return this;
3118
+ };
3119
+
3120
+ UAParser.VERSION = LIBVERSION;
3121
+ UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);
3122
+ UAParser.CPU = enumerize([ARCHITECTURE]);
3123
+ UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
3124
+ UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);
3125
+
3126
+ ///////////
3127
+ // Export
3128
+ //////////
3129
+
3130
+ // check js environment
3131
+ if (typeof(exports) !== UNDEF_TYPE) {
3132
+ // nodejs env
3133
+ if (typeof module !== UNDEF_TYPE && module.exports) {
3134
+ exports = module.exports = UAParser;
3135
+ }
3136
+ exports.UAParser = UAParser;
3137
+ } else {
3138
+ // requirejs env (optional)
3139
+ if (typeof(define) === FUNC_TYPE && define.amd) {
3140
+ define(function () {
3141
+ return UAParser;
3142
+ });
3143
+ } else if (typeof window !== UNDEF_TYPE) {
3144
+ // browser env
3145
+ window.UAParser = UAParser;
3146
+ }
3147
+ }
3148
+
3149
+ // jQuery/Zepto specific (optional)
3150
+ // Note:
3151
+ // In AMD env the global scope should be kept clean, but jQuery is an exception.
3152
+ // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,
3153
+ // and we should catch that.
3154
+ var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);
3155
+ if ($ && !$.ua) {
3156
+ var parser = new UAParser();
3157
+ $.ua = parser.getResult();
3158
+ $.ua.get = function () {
3159
+ return parser.getUA();
3160
+ };
3161
+ $.ua.set = function (ua) {
3162
+ parser.setUA(ua);
3163
+ var result = parser.getResult();
3164
+ for (var prop in result) {
3165
+ $.ua[prop] = result[prop];
3166
+ }
3167
+ };
3168
+ }
3169
+
3170
+ })(typeof window === 'object' ? window : this);
3171
+
3172
+ },{}]},{},[1])(1)
3173
+ });
3174
+
3175
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvZGF0YS9qZW5raW5zL3dvcmtzcGFjZS9WX1F1YWRyZWxfZXpxZC5xZC11dGlsaXRpZXNfbWFpbi9saWJzL3FkLWJyb3dzZXItY2hlY2svc3JjL2Jyb3dzZXItY2hlY2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYmFzZTY0LWpzL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3VhLXBhcnNlci1qcy9zcmMvdWEtcGFyc2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztBQ0FBLE1BQU0sa0JBQWtCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNoRCxBQUF5QjtBQUN6QixNQUFNLFdBQVc7RUFDZixnQkFBZ0IsRUFBRTtFQUNsQixtQkFBbUIsRUFBRTtFQUNyQixRQUFRLEVBQUU7RUFDVixNQUFNLEVBQUU7RUFDUixRQUFRLEVBQUU7RUFDVixpQkFBaUIsRUFBRTtFQUNuQixTQUFTLEVBQUU7RUFDWCxJQUFJLEtBQUs7Q0FDVixDQUFDOztBQUVGLE1BQU0sUUFBUSxHQUFHLG1CQUFtQjs7RUFFbEMsTUFBTSxZQUFZLE1BQU0sT0FBTyxDQUFDOztFQUVoQyxJQUFJLE9BQU8sTUFBTSxPQUFPLEtBQUssVUFBVSxFQUFFO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztHQUN0QixNQUFNO0lBQ0wsTUFBTSxPQUFPLEdBQUcsWUFBWTtNQUMxQixJQUFJLFNBQVMsRUFBRTtRQUNiLFNBQVMsRUFBRSxDQUFDO09BQ2I7TUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDZixDQUFDO0dBQ0g7Q0FDRixDQUFDOztBQUVGLHVCQUF1QjtFQUNyQixNQUFNLGdCQUFnQixtKzJDQUErQyxDQUFDOztFQUV0RSxNQUFNLGlCQUFpQixRQUFRLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztFQUNyRCxjQUFjLEdBQUcsR0FBRyxVQUFVLENBQUM7RUFDL0IsUUFBUSxLQUFLLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQzs7OztFQUkxQyxNQUFNLGtCQUFrQixJQUFJLGVBQWUsQ0FBQyxNQUFNLFVBQVUsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDOzs7RUFHcEYsTUFBTSxpQkFBaUIsT0FBTyxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDOzs7RUFHOUUsSUFBSSxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDLEVBQUU7SUFDdkQsTUFBTSxZQUFZO01BQ2hCLElBQUk7UUFDRixVQUFVLGdDQUFnQztRQUMxQztVQUNFLCtFQUErRTtVQUMvRSxxQ0FBcUM7T0FDeEM7TUFDRCxJQUFJO1FBQ0YsVUFBVSxxQ0FBcUM7UUFDL0M7VUFDRSw0RUFBNEU7VUFDNUUsb0RBQW9EO09BQ3ZEO01BQ0QsSUFBSTtRQUNGLFVBQVUsNENBQTRDO1FBQ3REO1VBQ0UsNEVBQTRFO1VBQzVFLHdEQUF3RDtPQUMzRDtNQUNELElBQUk7UUFDRixVQUFVLGtDQUFrQztRQUM1QztVQUNFLG1FQUFtRTtVQUNuRSx1REFBdUQ7T0FDMUQ7S0FDRixDQUFDOztJQUVGLE1BQU0sb0JBQW9CLFFBQVEsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELGlCQUFpQixVQUFVLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RELGlCQUFpQixVQUFVLEdBQUcsYUFBYSxDQUFDOztJQUU1QyxNQUFNLHNCQUFzQixDQUFDLFNBQVMsU0FBUyxJQUFJLFNBQVMsYUFBYSxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7SUFFekcsTUFBTSxXQUFXLFFBQVEsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLE1BQU0sVUFBVSxRQUFRLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxRQUFRLFVBQVUsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlFLE9BQU8sVUFBVSxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDNUUsUUFBUSxlQUFlLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLFFBQVEsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUN2RTtDQUNGOztBQUVELGlEQUFpRDtFQUMvQyxLQUFLLElBQUksR0FBRyxJQUFJLGFBQWEsRUFBRTtJQUM3QixRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3BDOztFQUVELE9BQU8sUUFBUSxDQUFDO0NBQ2pCOztBQUVELDZEQUE2RDtFQUMzRCxNQUFNLGNBQWMsZUFBZSxRQUFRLEtBQUssQ0FBQztFQUNqRCxNQUFNLHNCQUFzQixlQUFlLFFBQVEsTUFBTSxDQUFDOztFQUUxRCxJQUFJLGNBQWMsS0FBSyxDQUFDO0VBQ3hCLElBQUksb0JBQW9CLEVBQUUsRUFBRTtJQUMxQixjQUFjLElBQUksQ0FBQztHQUNwQjs7RUFFRCxJQUFJLFdBQVcsSUFBSSxjQUFjLEVBQUU7SUFDakMsTUFBTSxhQUFhLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQzs7SUFFL0MsSUFBSSxRQUFRLENBQUMsbUJBQW1CLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDeEQsY0FBYyxJQUFJLENBQUM7S0FDcEI7R0FDRjs7RUFFRCxPQUFPLFdBQVcsQ0FBQzs7RUFFbkIsZ0NBQWdDO0lBQzlCLE1BQU0sY0FBYyxlQUFlLFFBQVEsS0FBSyxDQUFDO0lBQ2pELElBQUksZ0JBQWdCLEtBQUssQ0FBQztJQUMxQixJQUFJLEVBQUUsV0FBVyxJQUFJLGNBQWMsQ0FBQyxFQUFFO01BQ3BDLGdCQUFnQixJQUFJLENBQUM7S0FDdEIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO01BQ3ZDLGdCQUFnQixJQUFJLENBQUM7S0FDdEI7SUFDRCxPQUFPLGFBQWEsQ0FBQztHQUN0QjtDQUNGOztBQUVELDhDQUE4QztFQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ2hFLE9BQU8sSUFBSSxDQUFDO0dBQ2I7O0VBRUQsT0FBTyxtQkFBbUIsQ0FBQztDQUM1Qjs7Ozs7O0FDcElEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2p2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsImNvbnN0IFVzZXJBZ2VudFBhcnNlciA9IHJlcXVpcmUoJ3VhLXBhcnNlci1qcycpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgREVGQVVMVFMgPSB7XG4gIEhlYWRsZXNzQ2hyb21lOiA1NyxcbiAgJ0Nocm9tZSBIZWFkbGVzcyc6IDU3LFxuICBDaHJvbWU6IDU3LFxuICBFZGdlOiA4MCxcbiAgU2FmYXJpOiAxMCxcbiAgJ01vYmlsZSBTYWZhcmknOiAxMCxcbiAgRmlyZWZveDogNTAsXG4gIElFOiBmYWxzZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyBMb2FkIG1haW4gd2hlbiBET00gcmVhZHkuXG4gIGNvbnN0IG9sZE9ubG9hZCA9IHdpbmRvdy5vbmxvYWQ7XG5cbiAgaWYgKHR5cGVvZiB3aW5kb3cub25sb2FkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgd2luZG93Lm9ubG9hZCA9IG1haW47XG4gIH0gZWxzZSB7XG4gICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbGRPbmxvYWQpIHtcbiAgICAgICAgb2xkT25sb2FkKCk7XG4gICAgICB9XG4gICAgICBtYWluKG9wdGlvbnMpO1xuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIG1haW4ob3B0aW9ucykge1xuICBjb25zdCBFcnJvclBhZ2VIdG1sID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZXJyb3ItcGFnZS5odG1sJyk7XG5cbiAgY29uc3QgZXJyb3JDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZXJyb3JDb250YWluZXIuaWQgPSAnb3V0ZGF0ZWQnO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVycm9yQ29udGFpbmVyKTtcblxuICAvLyBEZXNwaXRlIHRoZSBkb2NzLCBVQSBuZWVkcyB0byBiZSBwcm92aWRlZCB0byBjb25zdHJ1Y3RvciBleHBsaWNpdGx5OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFpc2FsbWFuL3VhLXBhcnNlci1qcy9pc3N1ZXMvOTBcbiAgY29uc3QgcGFyc2VkVXNlckFnZW50ID0gbmV3IFVzZXJBZ2VudFBhcnNlcih3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkuZ2V0UmVzdWx0KCk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuICBjb25zdCBicm93c2VyU3VwcG9ydCA9IG9wdGlvbnMgPyB1cGRhdGVEZWZhdWx0cyhERUZBVUxUUywgb3B0aW9ucykgOiBERUZBVUxUUztcblxuICAvLyBDaGVjayBpZiBicm93c2VyIGlzIHN1cHBvcnRlZFxuICBpZiAoaXNCcm93c2VyT3V0T2ZEYXRlKHBhcnNlZFVzZXJBZ2VudCwgYnJvd3NlclN1cHBvcnQpKSB7XG4gICAgY29uc3QgZXJyb3JUZXh0ID0ge1xuICAgICAgZW46IHtcbiAgICAgICAgaGVhZGxpbmU6ICdZb3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIENocm9tZSAoR29vZ2xlKSwgRmlyZWZveCAoTW96aWxsYSksICcgK1xuICAgICAgICAgICdFZGdlIChNaWNyb3NvZnQpIG9yIFNhZmFyaSAoQXBwbGUpLidcbiAgICAgIH0sXG4gICAgICBkZToge1xuICAgICAgICBoZWFkbGluZTogJ0lociBCcm93c2VyIHdpcmQgbmljaHQgdW50ZXJzdMO8dHp0LicsXG4gICAgICAgIHN1YmxpbmU6XG4gICAgICAgICAgJ1dpciBlbXBmZWhsZW4sIGRpZSBuZXVzdGUgVmVyc2lvbiB2b24gQ2hyb21lIChHb29nbGUpLCBGaXJlZm94IChNb3ppbGxhKSwgJyArXG4gICAgICAgICAgJ0VkZ2UgKE1pY3Jvc29mdCkgb2RlciBTYWZhcmkgKEFwcGxlKSB6dSB2ZXJ3ZW5kZW4uJ1xuICAgICAgfSxcbiAgICAgIGZyOiB7XG4gICAgICAgIGhlYWRsaW5lOiBcIlZvdHJlIG5hdmlnYXRldXIgbidlc3QgcGFzIHByaXMgZW4gY2hhcmdlLlwiLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgIFwiTm91cyB2b3VzIHJlY29tbWFuZG9ucyBkJ3V0aWxpc2VyIGxhIGRlcm5pw6hyZSB2ZXJzaW9uIGRlIENocm9tZSAoR29vZ2xlKSwgXCIgK1xuICAgICAgICAgICdGaXJlZm94IChNb3ppbGxhKSwgRWRnZSAoTWljcm9zb2Z0KSBvdSBTYWZhcmkgKEFwcGxlKS4nXG4gICAgICB9LFxuICAgICAgaXQ6IHtcbiAgICAgICAgaGVhZGxpbmU6ICdJbCB0dW8gYnJvd3NlciBub24gw6ggc3VwcG9ydGF0by4nLFxuICAgICAgICBzdWJsaW5lOlxuICAgICAgICAgIFwiU2kgY29uc2lnbGlhIGRpIHV0aWxpenphcmUgbCd1bHRpbWEgdmVyc2lvbmUgZGkgQ2hyb21lIChHb29nbGUpLCBcIiArXG4gICAgICAgICAgJ0ZpcmVmb3ggKE1vemlsbGEpLCBFZGdlIChNaWNyb3NvZnQpIG8gU2FmYXJpIChBcHBsZSkuJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBpbnNlcnRDb250ZW50SGVyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvdXRkYXRlZCcpO1xuICAgIGluc2VydENvbnRlbnRIZXJlLmNsYXNzTGlzdC5hZGQoJ3FkLWZ1bGxzY3JlZW4taW5mbycpO1xuICAgIGluc2VydENvbnRlbnRIZXJlLmlubmVySFRNTCA9IEVycm9yUGFnZUh0bWw7XG5cbiAgICBjb25zdCBicm93c2VyTGFuZ3VhZ2VDb2RlID0gKG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlKS5zdWJzdHJpbmcoMCwgMikudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGhlYWRsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDEnKTtcbiAgICBjb25zdCBzdWJsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaDMnKTtcbiAgICBoZWFkbGluZS5pbm5lckhUTUwgPSBlcnJvclRleHRbZ2V0TGFuZ3VhZ2VDb2RlKGJyb3dzZXJMYW5ndWFnZUNvZGUpXS5oZWFkbGluZTtcbiAgICBzdWJsaW5lLmlubmVySFRNTCA9IGVycm9yVGV4dFtnZXRMYW5ndWFnZUNvZGUoYnJvd3Nlckxhbmd1YWdlQ29kZSldLnN1YmxpbmU7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3FkLWVycm9yLXBhZ2UtY29udGVudCcpLmFwcGVuZENoaWxkKGhlYWRsaW5lKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncWQtZXJyb3ItcGFnZS1jb250ZW50JykuYXBwZW5kQ2hpbGQoc3VibGluZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmYXVsdHMoZGVmYXVsdHMsIHVwZGF0ZWRWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5IGluIHVwZGF0ZWRWYWx1ZXMpIHtcbiAgICBkZWZhdWx0c1trZXldID0gdXBkYXRlZFZhbHVlc1trZXldO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRzO1xufVxuXG5mdW5jdGlvbiBpc0Jyb3dzZXJPdXRPZkRhdGUocGFyc2VkVXNlckFnZW50LCBicm93c2VyU3VwcG9ydCkge1xuICBjb25zdCBicm93c2VyTmFtZSA9IHBhcnNlZFVzZXJBZ2VudC5icm93c2VyLm5hbWU7XG4gIGNvbnN0IGJyb3dzZXJNYWpvclZlcnNpb24gPSBwYXJzZWRVc2VyQWdlbnQuYnJvd3Nlci5tYWpvcjtcblxuICBsZXQgaXNPdXRPZkRhdGUgPSBmYWxzZTtcbiAgaWYgKGlzQnJvd3NlclVuc3VwcG9ydGVkKCkpIHtcbiAgICBpc091dE9mRGF0ZSA9IHRydWU7XG4gIH1cblxuICBpZiAoYnJvd3Nlck5hbWUgaW4gYnJvd3NlclN1cHBvcnQpIHtcbiAgICBjb25zdCBtaW5WZXJzaW9uID0gYnJvd3NlclN1cHBvcnRbYnJvd3Nlck5hbWVdO1xuXG4gICAgaWYgKHBhcnNlSW50KGJyb3dzZXJNYWpvclZlcnNpb24pIDwgcGFyc2VJbnQobWluVmVyc2lvbikpIHtcbiAgICAgIGlzT3V0T2ZEYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNPdXRPZkRhdGU7XG5cbiAgZnVuY3Rpb24gaXNCcm93c2VyVW5zdXBwb3J0ZWQoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSBwYXJzZWRVc2VyQWdlbnQuYnJvd3Nlci5uYW1lO1xuICAgIGxldCBpc1Vuc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKCEoYnJvd3Nlck5hbWUgaW4gYnJvd3NlclN1cHBvcnQpKSB7XG4gICAgICBpc1Vuc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFicm93c2VyU3VwcG9ydFticm93c2VyTmFtZV0pIHtcbiAgICAgIGlzVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaXNVbnN1cHBvcnRlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMYW5ndWFnZUNvZGUoYnJvd3Nlckxhbmd1YWdlQ29kZSkge1xuICBpZiAoWydlbicsICdkZScsICdmcicsICdpdCddLmluZGV4T2YoYnJvd3Nlckxhbmd1YWdlQ29kZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuICdlbic7XG4gIH1cblxuICByZXR1cm4gYnJvd3Nlckxhbmd1YWdlQ29kZTtcbn1cbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIiwiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbnZhciBLX01BWF9MRU5HVEggPSAweDdmZmZmZmZmXG5leHBvcnRzLmtNYXhMZW5ndGggPSBLX01BWF9MRU5HVEhcblxuLyoqXG4gKiBJZiBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgOlxuICogICA9PT0gdHJ1ZSAgICBVc2UgVWludDhBcnJheSBpbXBsZW1lbnRhdGlvbiAoZmFzdGVzdClcbiAqICAgPT09IGZhbHNlICAgUHJpbnQgd2FybmluZyBhbmQgcmVjb21tZW5kIHVzaW5nIGBidWZmZXJgIHY0Lnggd2hpY2ggaGFzIGFuIE9iamVjdFxuICogICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAobW9zdCBjb21wYXRpYmxlLCBldmVuIElFNilcbiAqXG4gKiBCcm93c2VycyB0aGF0IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGFyZSBJRSAxMCssIEZpcmVmb3ggNCssIENocm9tZSA3KywgU2FmYXJpIDUuMSssXG4gKiBPcGVyYSAxMS42KywgaU9TIDQuMisuXG4gKlxuICogV2UgcmVwb3J0IHRoYXQgdGhlIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB0eXBlZCBhcnJheXMgaWYgdGhlIGFyZSBub3Qgc3ViY2xhc3NhYmxlXG4gKiB1c2luZyBfX3Byb3RvX18uIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgXG4gKiAoU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzgpLiBJRSAxMCBsYWNrcyBzdXBwb3J0XG4gKiBmb3IgX19wcm90b19fIGFuZCBoYXMgYSBidWdneSB0eXBlZCBhcnJheSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgPSB0eXBlZEFycmF5U3VwcG9ydCgpXG5cbmlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgY29uc29sZS5lcnJvcihcbiAgICAnVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5ICcgK1xuICAgICdgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LidcbiAgKVxufVxuXG5mdW5jdGlvbiB0eXBlZEFycmF5U3VwcG9ydCAoKSB7XG4gIC8vIENhbiB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZD9cbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0geyBfX3Byb3RvX186IFVpbnQ4QXJyYXkucHJvdG90eXBlLCBmb286IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDQyIH0gfVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbi8qKlxuICogVGhlIEJ1ZmZlciBjb25zdHJ1Y3RvciByZXR1cm5zIGluc3RhbmNlcyBvZiBgVWludDhBcnJheWAgdGhhdCBoYXZlIHRoZWlyXG4gKiBwcm90b3R5cGUgY2hhbmdlZCB0byBgQnVmZmVyLnByb3RvdHlwZWAuIEZ1cnRoZXJtb3JlLCBgQnVmZmVyYCBpcyBhIHN1YmNsYXNzIG9mXG4gKiBgVWludDhBcnJheWAsIHNvIHRoZSByZXR1cm5lZCBpbnN0YW5jZXMgd2lsbCBoYXZlIGFsbCB0aGUgbm9kZSBgQnVmZmVyYCBtZXRob2RzXG4gKiBhbmQgdGhlIGBVaW50OEFycmF5YCBtZXRob2RzLiBTcXVhcmUgYnJhY2tldCBub3RhdGlvbiB3b3JrcyBhcyBleHBlY3RlZCAtLSBpdFxuICogcmV0dXJucyBhIHNpbmdsZSBvY3RldC5cbiAqXG4gKiBUaGUgYFVpbnQ4QXJyYXlgIHByb3RvdHlwZSByZW1haW5zIHVubW9kaWZpZWQuXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyIChhcmcsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUoYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICE9IG51bGwgJiZcbiAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlciwgU3ltYm9sLnNwZWNpZXMsIHtcbiAgICB2YWx1ZTogbnVsbCxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzSW5zdGFuY2UodmFsdWUsIEFycmF5QnVmZmVyKSB8fFxuICAgICAgKHZhbHVlICYmIGlzSW5zdGFuY2UodmFsdWUuYnVmZmVyLCBBcnJheUJ1ZmZlcikpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIHZhciB2YWx1ZU9mID0gdmFsdWUudmFsdWVPZiAmJiB2YWx1ZS52YWx1ZU9mKClcbiAgaWYgKHZhbHVlT2YgIT0gbnVsbCAmJiB2YWx1ZU9mICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbSh2YWx1ZU9mLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB2YXIgYiA9IGZyb21PYmplY3QodmFsdWUpXG4gIGlmIChiKSByZXR1cm4gYlxuXG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9QcmltaXRpdmUgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oXG4gICAgICB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdKCdzdHJpbmcnKSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoXG4gICAgKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgJyArXG4gICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICApXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20odmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuLy8gTm90ZTogQ2hhbmdlIHByb3RvdHlwZSAqYWZ0ZXIqIEJ1ZmZlci5mcm9tIGlzIGRlZmluZWQgdG8gd29ya2Fyb3VuZCBDaHJvbWUgYnVnOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC8xNDhcbkJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbkJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBzaXplICsgJ1wiIGlzIGludmFsaWQgZm9yIG9wdGlvbiBcInNpemVcIicpXG4gIH1cbn1cblxuZnVuY3Rpb24gYWxsb2MgKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgaWYgKHNpemUgPD0gMCkge1xuICAgIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbiAgfVxuICBpZiAoZmlsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBwYXkgYXR0ZW50aW9uIHRvIGVuY29kaW5nIGlmIGl0J3MgYSBzdHJpbmcuIFRoaXNcbiAgICAvLyBwcmV2ZW50cyBhY2NpZGVudGFsbHkgc2VuZGluZyBpbiBhIG51bWJlciB0aGF0IHdvdWxkXG4gICAgLy8gYmUgaW50ZXJwcmV0dGVkIGFzIGEgc3RhcnQgb2Zmc2V0LlxuICAgIHJldHVybiB0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnXG4gICAgICA/IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwsIGVuY29kaW5nKVxuICAgICAgOiBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsKVxuICB9XG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSlcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiBhbGxvYyhzaXplWywgZmlsbFssIGVuY29kaW5nXV0pXG4gKiovXG5CdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGFsbG9jKHNpemUsIGZpbGwsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBhbGxvY1Vuc2FmZSAoc2l6ZSkge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIHJldHVybiBjcmVhdGVCdWZmZXIoc2l6ZSA8IDAgPyAwIDogY2hlY2tlZChzaXplKSB8IDApXG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUoc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IGJ1Zi53cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuXG4gIGlmIChhY3R1YWwgIT09IGxlbmd0aCkge1xuICAgIC8vIFdyaXRpbmcgYSBoZXggc3RyaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgd2lsbFxuICAgIC8vIGNhdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IGludmFsaWQgY2hhcmFjdGVyIHRvIGJlIGlnbm9yZWQuIChlLmcuXG4gICAgLy8gJ2FieHhjZCcgd2lsbCBiZSB0cmVhdGVkIGFzICdhYicpXG4gICAgYnVmID0gYnVmLnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiBidWZcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5TGlrZSAoYXJyYXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCA8IDAgPyAwIDogY2hlY2tlZChhcnJheS5sZW5ndGgpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgdmFyIGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgYnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0IChvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdmFyIGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICB2YXIgeCA9IGEubGVuZ3RoXG4gIHZhciB5ID0gYi5sZW5ndGhcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIHZhciBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgdmFyIGJ1ZmZlciA9IEJ1ZmZlci5hbGxvY1Vuc2FmZShsZW5ndGgpXG4gIHZhciBwb3MgPSAwXG4gIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGJ1ZiA9IGxpc3RbaV1cbiAgICBpZiAoaXNJbnN0YW5jZShidWYsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgfVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IGlzSW5zdGFuY2Uoc3RyaW5nLCBBcnJheUJ1ZmZlcikpIHtcbiAgICByZXR1cm4gc3RyaW5nLmJ5dGVMZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIHN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIG9yIEFycmF5QnVmZmVyLiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2Ygc3RyaW5nXG4gICAgKVxuICB9XG5cbiAgdmFyIGxlbiA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2Vyc2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIHZhciBpID0gYltuXVxuICBiW25dID0gYlttXVxuICBiW21dID0gaVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAxNiA9IGZ1bmN0aW9uIHN3YXAxNiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgMiAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gMikge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDEpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbiBzd2FwMzIgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA4ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA4KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgNylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgNilcbiAgICBzd2FwKHRoaXMsIGkgKyAyLCBpICsgNSlcbiAgICBzd2FwKHRoaXMsIGkgKyAzLCBpICsgNClcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBCdWZmZXIucHJvdG90eXBlLnRvU3RyaW5nXG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuXG4gIGlmIChsZW5ndGggPiBzdHJMZW4gLyAyKSB7XG4gICAgbGVuZ3RoID0gc3RyTGVuIC8gMlxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gbGF0aW4xV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYXNjaWlXcml0ZShidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYmFzZTY0VG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiB1Y3MyV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGYxNmxlVG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gd3JpdGUgKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgsIGVuY29kaW5nKSB7XG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcpXG4gIGlmIChvZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIGVuY29kaW5nKVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBvZmZzZXRcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgb2Zmc2V0WywgbGVuZ3RoXVssIGVuY29kaW5nXSlcbiAgfSBlbHNlIGlmIChpc0Zpbml0ZShvZmZzZXQpKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA+Pj4gMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWYgPSB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpXG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRMRSA9IGZ1bmN0aW9uIHJlYWRVSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICgodGhpc1tvZmZzZXRdKSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikpICtcbiAgICAgICh0aGlzW29mZnNldCArIDNdICogMHgxMDAwMDAwKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoXG4gIHZhciBtdWwgPSAxXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIDFdIHwgKHRoaXNbb2Zmc2V0XSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbiByZWFkSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gMFxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsICg4ICogYnl0ZUxlbmd0aCkgLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweDdmLCAtMHg4MClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0XG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCAmJiB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiB3aGVuIGF2YWlsYWJsZSwgbWlzc2luZyBmcm9tIElFMTFcbiAgICB0aGlzLmNvcHlXaXRoaW4odGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpXG4gIH0gZWxzZSBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH1cblxuICAvLyBJbnZhbGlkIHJhbmdlcyBhcmUgbm90IHNldCB0byBhIGRlZmF1bHQsIHNvIGNhbiByYW5nZSBjaGVjayBlYXJseS5cbiAgaWYgKHN0YXJ0IDwgMCB8fCB0aGlzLmxlbmd0aCA8IHN0YXJ0IHx8IHRoaXMubGVuZ3RoIDwgZW5kKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ091dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0YXJ0ID0gc3RhcnQgPj4+IDBcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyB0aGlzLmxlbmd0aCA6IGVuZCA+Pj4gMFxuXG4gIGlmICghdmFsKSB2YWwgPSAwXG5cbiAgdmFyIGlcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgICAgdGhpc1tpXSA9IHZhbFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuaXNCdWZmZXIodmFsKVxuICAgICAgPyB2YWxcbiAgICAgIDogQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBIRUxQRVIgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09XG5cbnZhciBJTlZBTElEX0JBU0U2NF9SRSA9IC9bXisvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHRha2VzIGVxdWFsIHNpZ25zIGFzIGVuZCBvZiB0aGUgQmFzZTY0IGVuY29kaW5nXG4gIHN0ciA9IHN0ci5zcGxpdCgnPScpWzBdXG4gIC8vIE5vZGUgc3RyaXBzIG91dCBpbnZhbGlkIGNoYXJhY3RlcnMgbGlrZSBcXG4gYW5kIFxcdCBmcm9tIHRoZSBzdHJpbmcsIGJhc2U2NC1qcyBkb2VzIG5vdFxuICBzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qIFVBUGFyc2VyLmpzIHYxLjAuNDBcbiAgIENvcHlyaWdodCDCqSAyMDEyLTIwMjQgRmFpc2FsIFNhbG1hbiA8ZkBmYWlzYWxtYW4uY29tPlxuICAgTUlUIExpY2Vuc2UgKi8vKlxuICAgRGV0ZWN0IEJyb3dzZXIsIEVuZ2luZSwgT1MsIENQVSwgYW5kIERldmljZSB0eXBlL21vZGVsIGZyb20gVXNlci1BZ2VudCBkYXRhLlxuICAgU3VwcG9ydHMgYnJvd3NlciAmIG5vZGUuanMgZW52aXJvbm1lbnQuIFxuICAgRGVtbyAgIDogaHR0cHM6Ly9mYWlzYWxtYW4uZ2l0aHViLmlvL3VhLXBhcnNlci1qc1xuICAgU291cmNlIDogaHR0cHM6Ly9naXRodWIuY29tL2ZhaXNhbG1hbi91YS1wYXJzZXItanMgKi9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4oZnVuY3Rpb24gKHdpbmRvdywgdW5kZWZpbmVkKSB7XG5cbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLy8vLy8vLy8vLy8vL1xuICAgIC8vIENvbnN0YW50c1xuICAgIC8vLy8vLy8vLy8vLy9cblxuXG4gICAgdmFyIExJQlZFUlNJT04gID0gJzEuMC40MCcsXG4gICAgICAgIEVNUFRZICAgICAgID0gJycsXG4gICAgICAgIFVOS05PV04gICAgID0gJz8nLFxuICAgICAgICBGVU5DX1RZUEUgICA9ICdmdW5jdGlvbicsXG4gICAgICAgIFVOREVGX1RZUEUgID0gJ3VuZGVmaW5lZCcsXG4gICAgICAgIE9CSl9UWVBFICAgID0gJ29iamVjdCcsXG4gICAgICAgIFNUUl9UWVBFICAgID0gJ3N0cmluZycsXG4gICAgICAgIE1BSk9SICAgICAgID0gJ21ham9yJyxcbiAgICAgICAgTU9ERUwgICAgICAgPSAnbW9kZWwnLFxuICAgICAgICBOQU1FICAgICAgICA9ICduYW1lJyxcbiAgICAgICAgVFlQRSAgICAgICAgPSAndHlwZScsXG4gICAgICAgIFZFTkRPUiAgICAgID0gJ3ZlbmRvcicsXG4gICAgICAgIFZFUlNJT04gICAgID0gJ3ZlcnNpb24nLFxuICAgICAgICBBUkNISVRFQ1RVUkU9ICdhcmNoaXRlY3R1cmUnLFxuICAgICAgICBDT05TT0xFICAgICA9ICdjb25zb2xlJyxcbiAgICAgICAgTU9CSUxFICAgICAgPSAnbW9iaWxlJyxcbiAgICAgICAgVEFCTEVUICAgICAgPSAndGFibGV0JyxcbiAgICAgICAgU01BUlRUViAgICAgPSAnc21hcnR0dicsXG4gICAgICAgIFdFQVJBQkxFICAgID0gJ3dlYXJhYmxlJyxcbiAgICAgICAgRU1CRURERUQgICAgPSAnZW1iZWRkZWQnLFxuICAgICAgICBVQV9NQVhfTEVOR1RIID0gNTAwO1xuXG4gICAgdmFyIEFNQVpPTiAgPSAnQW1hem9uJyxcbiAgICAgICAgQVBQTEUgICA9ICdBcHBsZScsXG4gICAgICAgIEFTVVMgICAgPSAnQVNVUycsXG4gICAgICAgIEJMQUNLQkVSUlkgPSAnQmxhY2tCZXJyeScsXG4gICAgICAgIEJST1dTRVIgPSAnQnJvd3NlcicsXG4gICAgICAgIENIUk9NRSAgPSAnQ2hyb21lJyxcbiAgICAgICAgRURHRSAgICA9ICdFZGdlJyxcbiAgICAgICAgRklSRUZPWCA9ICdGaXJlZm94JyxcbiAgICAgICAgR09PR0xFICA9ICdHb29nbGUnLFxuICAgICAgICBIVUFXRUkgID0gJ0h1YXdlaScsXG4gICAgICAgIExHICAgICAgPSAnTEcnLFxuICAgICAgICBNSUNST1NPRlQgPSAnTWljcm9zb2Z0JyxcbiAgICAgICAgTU9UT1JPTEEgID0gJ01vdG9yb2xhJyxcbiAgICAgICAgT1BFUkEgICA9ICdPcGVyYScsXG4gICAgICAgIFNBTVNVTkcgPSAnU2Ftc3VuZycsXG4gICAgICAgIFNIQVJQICAgPSAnU2hhcnAnLFxuICAgICAgICBTT05ZICAgID0gJ1NvbnknLFxuICAgICAgICBYSUFPTUkgID0gJ1hpYW9taScsXG4gICAgICAgIFpFQlJBICAgPSAnWmVicmEnLFxuICAgICAgICBGQUNFQk9PSyAgICA9ICdGYWNlYm9vaycsXG4gICAgICAgIENIUk9NSVVNX09TID0gJ0Nocm9taXVtIE9TJyxcbiAgICAgICAgTUFDX09TICA9ICdNYWMgT1MnLFxuICAgICAgICBTVUZGSVhfQlJPV1NFUiA9ICcgQnJvd3Nlcic7XG5cbiAgICAvLy8vLy8vLy8vL1xuICAgIC8vIEhlbHBlclxuICAgIC8vLy8vLy8vLy9cblxuICAgIHZhciBleHRlbmQgPSBmdW5jdGlvbiAocmVnZXhlcywgZXh0ZW5zaW9ucykge1xuICAgICAgICAgICAgdmFyIG1lcmdlZFJlZ2V4ZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcmVnZXhlcykge1xuICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25zW2ldICYmIGV4dGVuc2lvbnNbaV0ubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBtZXJnZWRSZWdleGVzW2ldID0gZXh0ZW5zaW9uc1tpXS5jb25jYXQocmVnZXhlc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUmVnZXhlc1tpXSA9IHJlZ2V4ZXNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZFJlZ2V4ZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcml6ZSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgIHZhciBlbnVtcyA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaT0wOyBpPGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVudW1zW2FycltpXS50b1VwcGVyQ2FzZSgpXSA9IGFycltpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbnVtcztcbiAgICAgICAgfSxcbiAgICAgICAgaGFzID0gZnVuY3Rpb24gKHN0cjEsIHN0cjIpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygc3RyMSA9PT0gU1RSX1RZUEUgPyBsb3dlcml6ZShzdHIyKS5pbmRleE9mKGxvd2VyaXplKHN0cjEpKSAhPT0gLTEgOiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgbG93ZXJpemUgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1ham9yaXplID0gZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YodmVyc2lvbikgPT09IFNUUl9UWVBFID8gdmVyc2lvbi5yZXBsYWNlKC9bXlxcZFxcLl0vZywgRU1QVFkpLnNwbGl0KCcuJylbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIHRyaW0gPSBmdW5jdGlvbiAoc3RyLCBsZW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yoc3RyKSA9PT0gU1RSX1RZUEUpIHtcbiAgICAgICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXlxcc1xccyovLCBFTVBUWSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZihsZW4pID09PSBVTkRFRl9UWVBFID8gc3RyIDogc3RyLnN1YnN0cmluZygwLCBVQV9NQVhfTEVOR1RIKTtcbiAgICAgICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gTWFwIGhlbHBlclxuICAgIC8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgcmd4TWFwcGVyID0gZnVuY3Rpb24gKHVhLCBhcnJheXMpIHtcblxuICAgICAgICAgICAgdmFyIGkgPSAwLCBqLCBrLCBwLCBxLCBtYXRjaGVzLCBtYXRjaDtcblxuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGFsbCByZWdleGVzIG1hcHNcbiAgICAgICAgICAgIHdoaWxlIChpIDwgYXJyYXlzLmxlbmd0aCAmJiAhbWF0Y2hlcykge1xuXG4gICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gYXJyYXlzW2ldLCAgICAgICAvLyBldmVuIHNlcXVlbmNlICgwLDIsNCwuLilcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBhcnJheXNbaSArIDFdOyAgIC8vIG9kZCBzZXF1ZW5jZSAoMSwzLDUsLi4pXG4gICAgICAgICAgICAgICAgaiA9IGsgPSAwO1xuXG4gICAgICAgICAgICAgICAgLy8gdHJ5IG1hdGNoaW5nIHVhc3RyaW5nIHdpdGggcmVnZXhlc1xuICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgcmVnZXgubGVuZ3RoICYmICFtYXRjaGVzKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdleFtqXSkgeyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gcmVnZXhbaisrXS5leGVjKHVhKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoZXNbKytrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcHJvcHNbcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgZ2l2ZW4gcHJvcGVydHkgaXMgYWN0dWFsbHkgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHEgPT09IE9CSl9UWVBFICYmIHEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcVsxXSA9PSBGVU5DX1RZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gbW9kaWZpZWQgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXS5jYWxsKHRoaXMsIG1hdGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWduIGdpdmVuIHZhbHVlLCBpZ25vcmUgcmVnZXggbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gcVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBmdW5jdGlvbiBvciByZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxWzFdID09PSBGVU5DX1RZUEUgJiYgIShxWzFdLmV4ZWMgJiYgcVsxXS50ZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGwgZnVuY3Rpb24gKHVzdWFsbHkgc3RyaW5nIG1hcHBlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzFdLmNhbGwodGhpcywgbWF0Y2gsIHFbMl0pIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW5pdGl6ZSBtYXRjaCB1c2luZyBnaXZlbiByZWdleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbcVswXV0gPSBtYXRjaCA/IG1hdGNoLnJlcGxhY2UocVsxXSwgcVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FbMF1dID0gbWF0Y2ggPyBxWzNdLmNhbGwodGhpcywgbWF0Y2gucmVwbGFjZShxWzFdLCBxWzJdKSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3FdID0gbWF0Y2ggPyBtYXRjaCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHN0ck1hcHBlciA9IGZ1bmN0aW9uIChzdHIsIG1hcCkge1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpIGluIG1hcCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgdmFsdWUgaXMgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1hcFtpXSA9PT0gT0JKX1RZUEUgJiYgbWFwW2ldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXBbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXMobWFwW2ldW2pdLCBzdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09PSBVTktOT1dOKSA/IHVuZGVmaW5lZCA6IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhcyhtYXBbaV0sIHN0cikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09PSBVTktOT1dOKSA/IHVuZGVmaW5lZCA6IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eSgnKicpID8gbWFwWycqJ10gOiBzdHI7XG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFN0cmluZyBtYXBcbiAgICAvLy8vLy8vLy8vLy8vL1xuXG4gICAgLy8gU2FmYXJpIDwgMy4wXG4gICAgdmFyIG9sZFNhZmFyaU1hcCA9IHtcbiAgICAgICAgICAgICcxLjAnICAgOiAnLzgnLFxuICAgICAgICAgICAgJzEuMicgICA6ICcvMScsXG4gICAgICAgICAgICAnMS4zJyAgIDogJy8zJyxcbiAgICAgICAgICAgICcyLjAnICAgOiAnLzQxMicsXG4gICAgICAgICAgICAnMi4wLjInIDogJy80MTYnLFxuICAgICAgICAgICAgJzIuMC4zJyA6ICcvNDE3JyxcbiAgICAgICAgICAgICcyLjAuNCcgOiAnLzQxOScsXG4gICAgICAgICAgICAnPycgICAgIDogJy8nXG4gICAgICAgIH0sXG4gICAgICAgIHdpbmRvd3NWZXJzaW9uTWFwID0ge1xuICAgICAgICAgICAgJ01FJyAgICAgICAgOiAnNC45MCcsXG4gICAgICAgICAgICAnTlQgMy4xMScgICA6ICdOVDMuNTEnLFxuICAgICAgICAgICAgJ05UIDQuMCcgICAgOiAnTlQ0LjAnLFxuICAgICAgICAgICAgJzIwMDAnICAgICAgOiAnTlQgNS4wJyxcbiAgICAgICAgICAgICdYUCcgICAgICAgIDogWydOVCA1LjEnLCAnTlQgNS4yJ10sXG4gICAgICAgICAgICAnVmlzdGEnICAgICA6ICdOVCA2LjAnLFxuICAgICAgICAgICAgJzcnICAgICAgICAgOiAnTlQgNi4xJyxcbiAgICAgICAgICAgICc4JyAgICAgICAgIDogJ05UIDYuMicsXG4gICAgICAgICAgICAnOC4xJyAgICAgICA6ICdOVCA2LjMnLFxuICAgICAgICAgICAgJzEwJyAgICAgICAgOiBbJ05UIDYuNCcsICdOVCAxMC4wJ10sXG4gICAgICAgICAgICAnUlQnICAgICAgICA6ICdBUk0nXG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vXG4gICAgLy8gUmVnZXggbWFwXG4gICAgLy8vLy8vLy8vLy8vL1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7XG5cbiAgICAgICAgYnJvd3NlciA6IFtbXG5cbiAgICAgICAgICAgIC9cXGIoPzpjcm1vfGNyaW9zKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBmb3IgQW5kcm9pZC9pT1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0Nocm9tZSddXSwgW1xuICAgICAgICAgICAgL2VkZyg/OmV8aW9zfGEpP1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaWNyb3NvZnQgRWRnZVxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnRWRnZSddXSwgW1xuXG4gICAgICAgICAgICAvLyBQcmVzdG8gYmFzZWRcbiAgICAgICAgICAgIC8ob3BlcmEgbWluaSlcXC8oWy1cXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgTWluaVxuICAgICAgICAgICAgLyhvcGVyYSBbbW9iaWxldGFiXXszLDZ9KVxcYi4rdmVyc2lvblxcLyhbLVxcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgLy8gT3BlcmEgTW9iaS9UYWJsZXRcbiAgICAgICAgICAgIC8ob3BlcmEpKD86Lit2ZXJzaW9uXFwvfFtcXC8gXSspKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9vcGlvc1tcXC8gXSsoW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgbWluaSBvbiBpcGhvbmUgPj0gOC4wXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgTWluaSddXSwgW1xuICAgICAgICAgICAgL1xcYm9wKD86cmcpP3hcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgR1hcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgT1BFUkErJyBHWCddXSwgW1xuICAgICAgICAgICAgL1xcYm9wclxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3BlcmEgV2Via2l0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBXV0sIFtcblxuICAgICAgICAgICAgLy8gTWl4ZWRcbiAgICAgICAgICAgIC9cXGJiW2FpXSpkKD86dWhkfFt1Yl0qW2Fla29wcnN3eF17NSw2fSlbXFwvIF0/KFtcXHdcXC5dKykvaSAgICAgICAgICAgIC8vIEJhaWR1XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdCYWlkdSddXSwgW1xuICAgICAgICAgICAgL1xcYig/Om14YnJvd3NlcnxteGlvc3xteWllMilcXC8/KFstXFx3XFwuXSopXFxiL2kgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heHRob25cbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ01heHRob24nXV0sIFtcbiAgICAgICAgICAgIC8oa2luZGxlKVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlXG4gICAgICAgICAgICAvKGx1bmFzY2FwZXxtYXh0aG9ufG5ldGZyb250fGphc21pbmV8YmxhemVyfHNsZWlwbmlyKVtcXC8gXT8oW1xcd1xcLl0qKS9pLCAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMdW5hc2NhcGUvTWF4dGhvbi9OZXRmcm9udC9KYXNtaW5lL0JsYXplci9TbGVpcG5pclxuICAgICAgICAgICAgLy8gVHJpZGVudCBiYXNlZFxuICAgICAgICAgICAgLyhhdmFudHxpZW1vYmlsZXxzbGltKD86YnJvd3Nlcnxib2F0fGpldCkpW1xcLyBdPyhbXFxkXFwuXSopL2ksICAgICAgICAvLyBBdmFudC9JRU1vYmlsZS9TbGltQnJvd3Nlci9TbGltQm9hdC9TbGltamV0XG4gICAgICAgICAgICAvKD86bXN8XFwoKShpZSkgKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyXG5cbiAgICAgICAgICAgIC8vIEJsaW5rL1dlYmtpdC9LSFRNTCBiYXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmxvY2svUm9ja01lbHQvTWlkb3JpL0VwaXBoYW55L1NpbGsvU2t5ZmlyZS9Cb2x0L0lyb24vSXJpZGl1bS9QaGFudG9tSlMvQm93c2VyL1F1cFppbGxhL0ZhbGtvblxuICAgICAgICAgICAgLyhmbG9ja3xyb2NrbWVsdHxtaWRvcml8ZXBpcGhhbnl8c2lsa3xza3lmaXJlfG92aWJyb3dzZXJ8Ym9sdHxpcm9ufHZpdmFsZGl8aXJpZGl1bXxwaGFudG9tanN8Ym93c2VyfHF1cHppbGxhfGZhbGtvbnxyZWtvbnF8cHVmZmlufGJyYXZlfHdoYWxlKD8hLituYXZlcil8cXFicm93c2VybGl0ZXxkdWNrZHVja2dvfGtsYXJ8aGVsaW98KD89Y29tb2RvXyk/ZHJhZ29uKVxcLyhbLVxcd1xcLl0rKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWtvbnEvUHVmZmluL0JyYXZlL1doYWxlL1FRQnJvd3NlckxpdGUvUVEvL1ZpdmFsZGkvRHVja0R1Y2tHby9LbGFyL0hlbGlvL0RyYWdvblxuICAgICAgICAgICAgLyhoZXl0YXB8b3ZpfDExNSlicm93c2VyXFwvKFtcXGRcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIZXlUYXAvT3ZpLzExNVxuICAgICAgICAgICAgLyh3ZWlibylfXyhbXFxkXFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlaWJvXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9xdWFyayg/OnBjKT9cXC8oWy1cXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUXVhcmtcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1F1YXJrJ11dLCBbXG4gICAgICAgICAgICAvXFxiZGRnXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdWNrRHVja0dvXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdEdWNrRHVja0dvJ11dLCBbXG4gICAgICAgICAgICAvKD86XFxidWM/ID9icm93c2VyfCg/Omp1Yy4rKXVjd2ViKVtcXC8gXT8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAvLyBVQ0Jyb3dzZXJcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1VDJytCUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC9taWNyb20uK1xcYnFiY29yZVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlQ2hhdCBEZXNrdG9wIGZvciBXaW5kb3dzIEJ1aWx0LWluIEJyb3dzZXJcbiAgICAgICAgICAgIC9cXGJxYmNvcmVcXC8oW1xcd1xcLl0rKS4rbWljcm9tL2ksXG4gICAgICAgICAgICAvbWljcm9tZXNzZW5nZXJcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlQ2hhdFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnV2VDaGF0J11dLCBbXG4gICAgICAgICAgICAva29ucXVlcm9yXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtvbnF1ZXJvclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnS29ucXVlcm9yJ11dLCBbXG4gICAgICAgICAgICAvdHJpZGVudC4rcnZbOiBdKFtcXHdcXC5dezEsOX0pXFxiLitsaWtlIGdlY2tvL2kgICAgICAgICAgICAgICAgICAgICAgIC8vIElFMTFcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0lFJ11dLCBbXG4gICAgICAgICAgICAveWEoPzpzZWFyY2gpP2Jyb3dzZXJcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFlhbmRleFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnWWFuZGV4J11dLCBbXG4gICAgICAgICAgICAvc2xicm93c2VyXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNtYXJ0IExlbm92byBCcm93c2VyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTbWFydCBMZW5vdm8gJytCUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC8oYXZhc3R8YXZnKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZhc3QvQVZHIFNlY3VyZSBCcm93c2VyXG4gICAgICAgICAgICBdLCBbW05BTUUsIC8oLispLywgJyQxIFNlY3VyZSAnK0JST1dTRVJdLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgL1xcYmZvY3VzXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBGb2N1c1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBGSVJFRk9YKycgRm9jdXMnXV0sIFtcbiAgICAgICAgICAgIC9cXGJvcHRcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhIFRvdWNoXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgVG91Y2gnXV0sIFtcbiAgICAgICAgICAgIC9jb2NfY29jXFx3K1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvYyBDb2MgQnJvd3NlclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnQ29jIENvYyddXSwgW1xuICAgICAgICAgICAgL2RvbGZpblxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2xwaGluXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdEb2xwaGluJ11dLCBbXG4gICAgICAgICAgICAvY29hc3RcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9wZXJhIENvYXN0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIE9QRVJBKycgQ29hc3QnXV0sIFtcbiAgICAgICAgICAgIC9taXVpYnJvd3NlclxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUlVSSBCcm93c2VyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdNSVVJJyArIFNVRkZJWF9CUk9XU0VSXV0sIFtcbiAgICAgICAgICAgIC9meGlvc1xcLyhbXFx3XFwuLV0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZWZveCBmb3IgaU9TXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEZJUkVGT1hdXSwgW1xuICAgICAgICAgICAgL1xcYnFpaG9vYnJvd3NlclxcLz8oW1xcd1xcLl0qKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzYwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICczNjAnXV0sIFtcbiAgICAgICAgICAgIC9cXGIocXEpXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFFRXG4gICAgICAgICAgICBdLCBbW05BTUUsIC8oLispLywgJyQxQnJvd3NlciddLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgLyhvY3VsdXN8c2FpbGZpc2h8aHVhd2VpfHZpdm98cGljbylicm93c2VyXFwvKFtcXHdcXC5dKykvaVxuICAgICAgICAgICAgXSwgW1tOQU1FLCAvKC4rKS8sICckMScgKyBTVUZGSVhfQlJPV1NFUl0sIFZFUlNJT05dLCBbICAgICAgICAgICAgICAvLyBPY3VsdXMvU2FpbGZpc2gvSHVhd2VpQnJvd3Nlci9WaXZvQnJvd3Nlci9QaWNvQnJvd3NlclxuICAgICAgICAgICAgL3NhbXN1bmdicm93c2VyXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1zdW5nIEludGVybmV0XG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIFNBTVNVTkcgKyAnIEludGVybmV0J11dLCBbXG4gICAgICAgICAgICAvbWV0YXNyW1xcLyBdPyhbXFxkXFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvZ291IEV4cGxvcmVyXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTb2dvdSBFeHBsb3JlciddXSwgW1xuICAgICAgICAgICAgLyhzb2dvdSltb1xcdytcXC8oW1xcZFxcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29nb3UgTW9iaWxlXG4gICAgICAgICAgICBdLCBbW05BTUUsICdTb2dvdSBNb2JpbGUnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8oZWxlY3Ryb24pXFwvKFtcXHdcXC5dKykgc2FmYXJpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWxlY3Ryb24tYmFzZWQgQXBwXG4gICAgICAgICAgICAvKHRlc2xhKSg/OiBxdGNhcmJyb3dzZXJ8XFwvKDIwXFxkXFxkXFwuWy1cXHdcXC5dKykpL2ksICAgICAgICAgICAgICAgICAgIC8vIFRlc2xhXG4gICAgICAgICAgICAvbT8ocXFicm93c2VyfDIzNDUoPz1icm93c2VyfGNocm9tZXxleHBsb3JlcikpXFx3KltcXC8gXT92PyhbXFx3XFwuXSspL2kgICAvLyBRUS8yMzQ1XG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8obGJicm93c2VyfHJla29ucSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGllQmFvIEJyb3dzZXIvUmVrb25xXG4gICAgICAgICAgICAvXFxbKGxpbmtlZGluKWFwcFxcXS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGlua2VkSW4gQXBwIGZvciBpT1MgJiBBbmRyb2lkXG4gICAgICAgICAgICBdLCBbTkFNRV0sIFtcbiAgICAgICAgICAgIC9vbWVcXC8oW1xcd1xcLl0rKSBcXHcqID8oaXJvbikgc2FmL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElyb25cbiAgICAgICAgICAgIC9vbWVcXC8oW1xcd1xcLl0rKS4rcWlodSAoMzYwKVtlc11lL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzYwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgTkFNRV0sIFtcblxuICAgICAgICAgICAgLy8gV2ViVmlld1xuICAgICAgICAgICAgLygoPzpmYmFuXFwvZmJpb3N8ZmJfaWFiXFwvZmI0YSkoPyEuK2ZiYXYpfDtmYmF2XFwvKFtcXHdcXC5dKyk7KS9pICAgICAgIC8vIEZhY2Vib29rIEFwcCBmb3IgaU9TICYgQW5kcm9pZFxuICAgICAgICAgICAgXSwgW1tOQU1FLCBGQUNFQk9PS10sIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvKEtsYXJuYSlcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtsYXJuYSBTaG9wcGluZyBCcm93c2VyIGZvciBpT1MgJiBBbmRyb2lkXG4gICAgICAgICAgICAvKGtha2FvKD86dGFsa3xzdG9yeSkpW1xcLyBdKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtha2FvIEFwcFxuICAgICAgICAgICAgLyhuYXZlcilcXCguKj8oXFxkK1xcLltcXHdcXC5dKykuKlxcKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXZlciBJbkFwcFxuICAgICAgICAgICAgL3NhZmFyaSAobGluZSlcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIEFwcCBmb3IgaU9TXG4gICAgICAgICAgICAvXFxiKGxpbmUpXFwvKFtcXHdcXC5dKylcXC9pYWIvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGluZSBBcHAgZm9yIEFuZHJvaWRcbiAgICAgICAgICAgIC8oYWxpcGF5KWNsaWVudFxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxpcGF5XG4gICAgICAgICAgICAvKHR3aXR0ZXIpKD86YW5kfCBmLitlXFwvKFtcXHdcXC5dKykpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR3aXR0ZXJcbiAgICAgICAgICAgIC8oY2hyb21pdW18aW5zdGFncmFtfHNuYXBjaGF0KVtcXC8gXShbLVxcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgLy8gQ2hyb21pdW0vSW5zdGFncmFtL1NuYXBjaGF0XG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC9cXGJnc2FcXC8oW1xcd1xcLl0rKSAuKnNhZmFyaVxcLy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgU2VhcmNoIEFwcGxpYW5jZSBvbiBpT1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0dTQSddXSwgW1xuICAgICAgICAgICAgL211c2ljYWxfbHkoPzouK2FwcF8/dmVyc2lvblxcL3xfKShbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaWtUb2tcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ1Rpa1RvayddXSwgW1xuXG4gICAgICAgICAgICAvaGVhZGxlc3NjaHJvbWUoPzpcXC8oW1xcd1xcLl0rKXwgKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9tZSBIZWFkbGVzc1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBDSFJPTUUrJyBIZWFkbGVzcyddXSwgW1xuXG4gICAgICAgICAgICAvIHd2XFwpLisoY2hyb21lKVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWUgV2ViVmlld1xuICAgICAgICAgICAgXSwgW1tOQU1FLCBDSFJPTUUrJyBXZWJWaWV3J10sIFZFUlNJT05dLCBbXG5cbiAgICAgICAgICAgIC9kcm9pZC4rIHZlcnNpb25cXC8oW1xcd1xcLl0rKVxcYi4rKD86bW9iaWxlIHNhZmFyaXxzYWZhcmkpL2kgICAgICAgICAgIC8vIEFuZHJvaWQgQnJvd3NlclxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnQW5kcm9pZCAnK0JST1dTRVJdXSwgW1xuXG4gICAgICAgICAgICAvKGNocm9tZXxvbW5pd2VifGFyb3JhfFt0aXplbm9rYV17NX0gP2Jyb3dzZXIpXFwvdj8oW1xcd1xcLl0rKS9pICAgICAgIC8vIENocm9tZS9PbW5pV2ViL0Fyb3JhL1RpemVuL05va2lhXG4gICAgICAgICAgICBdLCBbTkFNRSwgVkVSU0lPTl0sIFtcblxuICAgICAgICAgICAgL3ZlcnNpb25cXC8oW1xcd1xcLlxcLF0rKSAuKm1vYmlsZVxcL1xcdysgKHNhZmFyaSkvaSAgICAgICAgICAgICAgICAgICAgICAvLyBNb2JpbGUgU2FmYXJpXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdNb2JpbGUgU2FmYXJpJ11dLCBbXG4gICAgICAgICAgICAvdmVyc2lvblxcLyhbXFx3KFxcLnxcXCwpXSspIC4qKG1vYmlsZSA/c2FmYXJpfHNhZmFyaSkvaSAgICAgICAgICAgICAgICAvLyBTYWZhcmkgJiBTYWZhcmkgTW9iaWxlXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgTkFNRV0sIFtcbiAgICAgICAgICAgIC93ZWJraXQuKz8obW9iaWxlID9zYWZhcml8c2FmYXJpKShcXC9bXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIDwgMy4wXG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIHN0ck1hcHBlciwgb2xkU2FmYXJpTWFwXV0sIFtcblxuICAgICAgICAgICAgLyh3ZWJraXR8a2h0bWwpXFwvKFtcXHdcXC5dKykvaVxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG5cbiAgICAgICAgICAgIC8vIEdlY2tvIGJhc2VkXG4gICAgICAgICAgICAvKG5hdmlnYXRvcnxuZXRzY2FwZVxcZD8pXFwvKFstXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXRzY2FwZVxuICAgICAgICAgICAgXSwgW1tOQU1FLCAnTmV0c2NhcGUnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8od29sdmljfGxpYnJld29sZilcXC8oW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29sdmljL0xpYnJlV29sZlxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvbW9iaWxlIHZyOyBydjooW1xcd1xcLl0rKVxcKS4rZmlyZWZveC9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggUmVhbGl0eVxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBGSVJFRk9YKycgUmVhbGl0eSddXSwgW1xuICAgICAgICAgICAgL2VraW9oZi4rKGZsb3cpXFwvKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGbG93XG4gICAgICAgICAgICAvKHN3aWZ0Zm94KS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aWZ0Zm94XG4gICAgICAgICAgICAvKGljZWRyYWdvbnxpY2V3ZWFzZWx8Y2FtaW5vfGNoaW1lcmF8ZmVubmVjfG1hZW1vIGJyb3dzZXJ8bWluaW1vfGNvbmtlcm9yKVtcXC8gXT8oW1xcd1xcLlxcK10rKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJY2VEcmFnb24vSWNld2Vhc2VsL0NhbWluby9DaGltZXJhL0Zlbm5lYy9NYWVtby9NaW5pbW8vQ29ua2Vyb3JcbiAgICAgICAgICAgIC8oc2VhbW9ua2V5fGstbWVsZW9ufGljZWNhdHxpY2VhcGV8ZmlyZWJpcmR8cGhvZW5peHxwYWxlbW9vbnxiYXNpbGlza3x3YXRlcmZveClcXC8oWy1cXHdcXC5dKykkL2ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3gvU2VhTW9ua2V5L0stTWVsZW9uL0ljZUNhdC9JY2VBcGUvRmlyZWJpcmQvUGhvZW5peFxuICAgICAgICAgICAgLyhmaXJlZm94KVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdGhlciBGaXJlZm94LWJhc2VkXG4gICAgICAgICAgICAvKG1vemlsbGEpXFwvKFtcXHdcXC5dKykgLitydlxcOi4rZ2Vja29cXC9cXGQrL2ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vemlsbGFcblxuICAgICAgICAgICAgLy8gT3RoZXJcbiAgICAgICAgICAgIC8ocG9sYXJpc3xseW54fGRpbGxvfGljYWJ8ZG9yaXN8YW1heWF8dzNtfG5ldHN1cmZ8b2JpZ298bW9zYWljfCg/OmdvfGljZXx1cClbXFwuIF0/YnJvd3NlcilbLVxcLyBdP3Y/KFtcXHdcXC5dKykvaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9sYXJpcy9MeW54L0RpbGxvL2lDYWIvRG9yaXMvQW1heWEvdzNtL05ldFN1cmYvT2JpZ28vTW9zYWljL0dvL0lDRS9VUC5Ccm93c2VyXG4gICAgICAgICAgICAvKGxpbmtzKSBcXCgoW1xcd1xcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbmtzXG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIC9fL2csICcuJ11dLCBbXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8oY29iYWx0KVxcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29iYWx0XG4gICAgICAgICAgICBdLCBbTkFNRSwgW1ZFUlNJT04sIC9tYXN0ZXIufGx0cy4vLCBcIlwiXV1cbiAgICAgICAgXSxcblxuICAgICAgICBjcHUgOiBbW1xuXG4gICAgICAgICAgICAvKD86KGFtZHx4KD86KD86ODZ8NjQpWy1fXSk/fHdvd3x3aW4pNjQpWztcXCldL2kgICAgICAgICAgICAgICAgICAgICAvLyBBTUQ2NCAoeDY0KVxuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdhbWQ2NCddXSwgW1xuXG4gICAgICAgICAgICAvKGlhMzIoPz07KSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBMzIgKHF1aWNrdGltZSlcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCBsb3dlcml6ZV1dLCBbXG5cbiAgICAgICAgICAgIC8oKD86aVszNDZdfHgpODYpWztcXCldL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBMzIgKHg4NilcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnaWEzMiddXSwgW1xuXG4gICAgICAgICAgICAvXFxiKGFhcmNoNjR8YXJtKHY/OGU/bD98Xz82NCkpXFxiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUk02NFxuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdhcm02NCddXSwgW1xuXG4gICAgICAgICAgICAvXFxiKGFybSg/OnZbNjddKT9odD9uP1tmbF1wPylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJNSEZcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnYXJtaGYnXV0sIFtcblxuICAgICAgICAgICAgLy8gUG9ja2V0UEMgbWlzdGFrZW5seSBpZGVudGlmaWVkIGFzIFBvd2VyUENcbiAgICAgICAgICAgIC93aW5kb3dzIChjZXxtb2JpbGUpOyBwcGM7L2lcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAnYXJtJ11dLCBbXG5cbiAgICAgICAgICAgIC8oKD86cHBjfHBvd2VycGMpKD86NjQpPykoPzogbWFjfDt8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvd2VyUENcbiAgICAgICAgICAgIF0sIFtbQVJDSElURUNUVVJFLCAvb3dlci8sIEVNUFRZLCBsb3dlcml6ZV1dLCBbXG5cbiAgICAgICAgICAgIC8oc3VuNFxcdylbO1xcKV0vaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTUEFSQ1xuICAgICAgICAgICAgXSwgW1tBUkNISVRFQ1RVUkUsICdzcGFyYyddXSwgW1xuXG4gICAgICAgICAgICAvKCg/OmF2cjMyfGlhNjQoPz07KSl8NjhrKD89XFwpKXxcXGJhcm0oPz12KD86WzEtN118WzUtN10xKWw/fDt8ZWFiaSl8KD89YXRtZWwgKWF2cnwoPzppcml4fG1pcHN8c3BhcmMpKD86NjQpP1xcYnxwYS1yaXNjKS9pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElBNjQsIDY4SywgQVJNLzY0LCBBVlIvMzIsIElSSVgvNjQsIE1JUFMvNjQsIFNQQVJDLzY0LCBQQS1SSVNDXG4gICAgICAgICAgICBdLCBbW0FSQ0hJVEVDVFVSRSwgbG93ZXJpemVdXVxuICAgICAgICBdLFxuXG4gICAgICAgIGRldmljZSA6IFtbXG5cbiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBNT0JJTEVTICYgVEFCTEVUU1xuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvLyBTYW1zdW5nXG4gICAgICAgICAgICAvXFxiKHNjaC1pWzg5XTBcXGR8c2h3LW0zODBzfHNtLVtwdHhdXFx3ezIsNH18Z3QtW3BuXVxcZHsyLDR9fHNnaC10OFs1Nl05fG5leHVzIDEwKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNBTVNVTkddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoKD86c1tjZ3BdaHxndHxzbSktKD8hW2xyXSlcXHcrfHNjW2ctXT9bXFxkXSthP3xnYWxheHkgbmV4dXMpL2ksXG4gICAgICAgICAgICAvc2Ftc3VuZ1stIF0oKD8hc20tW2xyXSlbLVxcd10rKS9pLFxuICAgICAgICAgICAgL3NlYy0oc2doXFx3KykvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTQU1TVU5HXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEFwcGxlXG4gICAgICAgICAgICAvKD86XFwvfFxcKCkoaXAoPzpob25lfG9kKVtcXHcsIF0qKSg/OlxcL3w7KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpUG9kL2lQaG9uZVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcKChpcGFkKTtbLVxcd1xcKSw7IF0rYXBwbGUvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpUGFkXG4gICAgICAgICAgICAvYXBwbGVjb3JlbWVkaWFcXC9bXFx3XFwuXSsgXFwoKGlwYWQpL2ksXG4gICAgICAgICAgICAvXFxiKGlwYWQpXFxkXFxkPyxcXGRcXGQ/WztcXF1dLitpb3MvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyhtYWNpbnRvc2gpOy9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFQUExFXV0sIFtcblxuICAgICAgICAgICAgLy8gU2hhcnBcbiAgICAgICAgICAgIC9cXGIoc2gtP1thbHR2el0/XFxkXFxkW2EtZWttXT8pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgU0hBUlBdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gSG9ub3JcbiAgICAgICAgICAgIC8oPzpob25vcikoWy1cXHcgXSspWztcXCldL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0hvbm9yJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBIdWF3ZWlcbiAgICAgICAgICAgIC9cXGIoKD86YWdbcnNdWzIzXT98YmFoMj98c2h0P3xidHYpLWE/W2x3XVxcZHsyfSlcXGIoPyEuK2RcXC9zKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEhVQVdFSV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyg/Omh1YXdlaSkoWy1cXHcgXSspWztcXCldL2ksXG4gICAgICAgICAgICAvXFxiKG5leHVzIDZwfFxcd3syLDR9ZT8tW2F0dV0/W2xuXVtcXGR4XVswMTIzNTljXVthZG5dPylcXGIoPyEuK2RcXC9zKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEhVQVdFSV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBYaWFvbWlcbiAgICAgICAgICAgIC9cXGIocG9jb1tcXHcgXSt8bTJcXGR7M31qXFxkXFxkW2Etel17Mn0pKD86IGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgLy8gWGlhb21pIFBPQ09cbiAgICAgICAgICAgIC9cXGI7IChcXHcrKSBidWlsZFxcL2htXFwxL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhpYW9taSBIb25nbWkgJ251bWVyaWMnIG1vZGVsc1xuICAgICAgICAgICAgL1xcYihobVstXyBdP25vdGU/W18gXT8oPzpcXGRcXHcpPykgYnVpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWkgSG9uZ21pXG4gICAgICAgICAgICAvXFxiKHJlZG1pW1xcLV8gXT8oPzpub3RlfGspP1tcXHdfIF0rKSg/OiBidWl8XFwpKS9pLCAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWkgUmVkbWlcbiAgICAgICAgICAgIC9vaWRbXlxcKV0rOyAobT9bMTJdWzAtMzg5XVswMV1cXHd7Myw2fVtjLXldKSggYnVpfDsgd3Z8XFwpKS9pLCAgICAgICAgLy8gWGlhb21pIFJlZG1pICdudW1lcmljJyBtb2RlbHNcbiAgICAgICAgICAgIC9cXGIobWlbLV8gXT8oPzphXFxkfG9uZXxvbmVbXyBdcGx1c3xub3RlIGx0ZXxtYXh8Y2MpP1tfIF0/KD86XFxkP1xcdz8pW18gXT8oPzpwbHVzfHNlfGxpdGV8cHJvKT8pKD86IGJ1aXxcXCkpL2kgLy8gWGlhb21pIE1pXG4gICAgICAgICAgICBdLCBbW01PREVMLCAvXy9nLCAnICddLCBbVkVORE9SLCBYSUFPTUldLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9vaWRbXlxcKV0rOyAoMlxcZHs0fSgyODN8cnBiZilbY2dsXSkoIGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgICAgLy8gUmVkbWkgUGFkXG4gICAgICAgICAgICAvXFxiKG1pWy1fIF0/KD86cGFkKSg/OltcXHdfIF0rKSkoPzogYnVpfFxcKSkvaSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pIFBhZCB0YWJsZXRzXG4gICAgICAgICAgICBdLFtbTU9ERUwsIC9fL2csICcgJ10sIFtWRU5ET1IsIFhJQU9NSV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvLyBPUFBPXG4gICAgICAgICAgICAvOyAoXFx3KykgYnVpLisgb3Bwby9pLFxuICAgICAgICAgICAgL1xcYihjcGhbMTJdXFxkezN9fHAoPzphZnxjW2FsXXxkXFx3fGVbYXJdKVttdF1cXGQwfHg5MDA3fGExMDFvcClcXGIvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT1BQTyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIob3BkMlxcZHszfWE/KSBidWkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT1BQTyddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gVml2b1xuICAgICAgICAgICAgL3Zpdm8gKFxcdyspKD86IGJ1aXxcXCkpL2ksXG4gICAgICAgICAgICAvXFxiKHZbMTJdXFxkezN9XFx3P1thdF0pKD86IGJ1aXw7KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdWaXZvJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBSZWFsbWVcbiAgICAgICAgICAgIC9cXGIocm14WzEtM11cXGR7M30pKD86IGJ1aXw7fFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnUmVhbG1lJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBNb3Rvcm9sYVxuICAgICAgICAgICAgL1xcYihtaWxlc3RvbmV8ZHJvaWQoPzpbMi00eF18ICg/OmJpb25pY3x4Mnxwcm98cmF6cikpPzo/KCA0Zyk/KVxcYltcXHcgXStidWlsZFxcLy9pLFxuICAgICAgICAgICAgL1xcYm1vdCg/Om9yb2xhKT9bLSBdKFxcdyopL2ksXG4gICAgICAgICAgICAvKCg/Om1vdG9bXFx3XFwoXFwpIF0rfHh0XFxkezMsNH18bmV4dXMgNikoPz0gYnVpfFxcKSkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgTU9UT1JPTEFdLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIobXo2MFxcZHx4b29tWzIgXXswLDJ9KSBidWlsZFxcLy9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1PVE9ST0xBXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG5cbiAgICAgICAgICAgIC8vIExHXG4gICAgICAgICAgICAvKCg/PWxnKT9bdmxda1xcLT9cXGR7M30pIGJ1aXwgM1xcLlstXFx3OyBdezEwfWxnPy0oWzA2Y3Y5XXszLDR9KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIExHXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKGxtKD86LT9mMTAwW252XT98LVtcXHdcXC5dKykoPz0gYnVpfFxcKSl8bmV4dXMgWzQ1XSkvaSxcbiAgICAgICAgICAgIC9cXGJsZ1stZTtcXC8gXSsoKD8hYnJvd3NlcnxuZXRjYXN0fGFuZHJvaWQgdHYpXFx3KykvaSxcbiAgICAgICAgICAgIC9cXGJsZy0/KFtcXGRcXHddKykgYnVpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgTEddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gTGVub3ZvXG4gICAgICAgICAgICAvKGlkZWF0YWJbLVxcdyBdKykvaSxcbiAgICAgICAgICAgIC9sZW5vdm8gPyhzWzU2XTAwMFstXFx3XSt8dGFiKD86W1xcdyBdKyl8eXRbLVxcZFxcd117Nn18dGJbLVxcZFxcd117Nn0pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0xlbm92byddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gTm9raWFcbiAgICAgICAgICAgIC8oPzptYWVtb3xub2tpYSkuKihuOTAwfGx1bWlhIFxcZCspL2ksXG4gICAgICAgICAgICAvbm9raWFbLV8gXT8oWy1cXHdcXC5dKikvaVxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgL18vZywgJyAnXSwgW1ZFTkRPUiwgJ05va2lhJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBHb29nbGVcbiAgICAgICAgICAgIC8ocGl4ZWwgYylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBQaXhlbCBDXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEdPT0dMRV0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL2Ryb2lkLis7IChwaXhlbFtcXGRheGwgXXswLDZ9KSg/OiBidWl8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBQaXhlbFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBHT09HTEVdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gU29ueVxuICAgICAgICAgICAgL2Ryb2lkLis7IChhP1xcZFswLTJdezJ9c298W2MtZ11cXGR7NH18c29bLWdsXVxcdyt8eHEtYVxcd1s0LTddWzEyXSkoPz0gYnVpfFxcKS4rY2hyb21lXFwvKD8hWzEtNl17MCwxfVxcZFxcLikpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgU09OWV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL3NvbnkgdGFibGV0IFtwc10vaSxcbiAgICAgICAgICAgIC9cXGIoPzpzb255KT9zZ3BcXHcrKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtbTU9ERUwsICdYcGVyaWEgVGFibGV0J10sIFtWRU5ET1IsIFNPTlldLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gT25lUGx1c1xuICAgICAgICAgICAgLyAoa2IyMDA1fGluMjBbMTJdNXxiZTIwWzEyXVs1OV0pXFxiL2ksXG4gICAgICAgICAgICAvKD86b25lKT8oPzpwbHVzKT8gKGFcXGQwXFxkXFxkKSg/OiBifFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnT25lUGx1cyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gQW1hem9uXG4gICAgICAgICAgICAvKGFsZXhhKXdlYm0vaSxcbiAgICAgICAgICAgIC8oa2ZbYS16XXsyfXdpfGFlbyg/IWJjKVxcd1xcdykoIGJ1aXxcXCkpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlIEZpcmUgd2l0aG91dCBTaWxrIC8gRWNobyBTaG93XG4gICAgICAgICAgICAvKGtmW2Etel0rKSggYnVpfFxcKSkuK3NpbGtcXC8vaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gS2luZGxlIEZpcmUgSERcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKCg/OnNkfGtmKVswMzQ5aGlqb3JzdHV3XSspKCBidWl8XFwpKS4rc2lsa1xcLy9pICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBQaG9uZVxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgLyguKykvZywgJ0ZpcmUgUGhvbmUgJDEnXSwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEJsYWNrQmVycnlcbiAgICAgICAgICAgIC8ocGxheWJvb2spO1stXFx3XFwpLDsgXSsocmltKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFja0JlcnJ5IFBsYXlCb29rXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFZFTkRPUiwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxiKCg/OmJiW2EtZl18c3RbaHZdKTEwMC1cXGQpL2ksXG4gICAgICAgICAgICAvXFwoYmIxMDsgKFxcdyspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2tCZXJyeSAxMFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBCTEFDS0JFUlJZXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEFzdXNcbiAgICAgICAgICAgIC8oPzpcXGJ8YXN1c18pKHRyYW5zZm9bcHJpbWUgXXs0LDEwfSBcXHcrfGVlZXBjfHNsaWRlciBcXHcrfG5leHVzIDd8cGFkZm9uZXxwMDBbY2pdKS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFTVVNdLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC8gKHpbYmVzXTZbMDI3XVswMTJdW2ttXVtsc118emVuZm9uZSBcXGRcXHc/KVxcYi9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFTVVNdLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gSFRDXG4gICAgICAgICAgICAvKG5leHVzIDkpL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUQyBOZXh1cyA5XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdIVEMnXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKGh0YylbLTtfIF17MSwyfShbXFx3IF0rKD89XFwpfCBidWkpfFxcdyspL2ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhUQ1xuXG4gICAgICAgICAgICAvLyBaVEVcbiAgICAgICAgICAgIC8oenRlKVstIF0oW1xcdyBdKz8pKD86IGJ1aXxcXC98XFwpKS9pLFxuICAgICAgICAgICAgLyhhbGNhdGVsfGdlZWtzcGhvbmV8bmV4aWFufHBhbmFzb25pYyg/ISg/Ojt8XFwuKSl8c29ueSg/IS1icmEpKVstXyBdPyhbLVxcd10qKS9pICAgICAgICAgLy8gQWxjYXRlbC9HZWVrc1Bob25lL05leGlhbi9QYW5hc29uaWMvU29ueVxuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgW01PREVMLCAvXy9nLCAnICddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gVENMXG4gICAgICAgICAgICAvZHJvaWQgW1xcd1xcLl0rOyAoKD86OFsxNF05WzE2XXw5KD86MCg/OjQ4fDYwfDhbMDFdKXwxKD86M1syN118NjYpfDIoPzo2WzY5XXw5WzU2XSl8NDY2KSlbZ3Fzd3hdKVxcdyooXFwpfCBidWkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1RDTCddLCBbVFlQRSwgVEFCTEVUXV0sIFtcblxuICAgICAgICAgICAgLy8gaXRlbFxuICAgICAgICAgICAgLyhpdGVsKSAoKFxcdyspKS9pXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgbG93ZXJpemVdLCBNT0RFTCwgW1RZUEUsIHN0ck1hcHBlciwgeyAndGFibGV0JyA6IFsncDEwMDAxbCcsICd3NzAwMSddLCAnKicgOiAnbW9iaWxlJyB9XV0sIFtcblxuICAgICAgICAgICAgLy8gQWNlclxuICAgICAgICAgICAgL2Ryb2lkLis7IChbYWJdWzEtN10tP1swMTc4YV1cXGRcXGQ/KS9pXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdBY2VyJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvLyBNZWl6dVxuICAgICAgICAgICAgL2Ryb2lkLis7IChtWzEtNV0gbm90ZSkgYnVpL2ksXG4gICAgICAgICAgICAvXFxibXotKFstXFx3XXsyLH0pL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ01laXp1J10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVWxlZm9uZVxuICAgICAgICAgICAgLzsgKCg/OnBvd2VyICk/YXJtb3IoPzpbXFx3IF17MCw4fSkpKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1VsZWZvbmUnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIEVuZXJnaXplclxuICAgICAgICAgICAgLzsgKGVuZXJneSA/XFx3KykoPzogYnVpfFxcKSkvaSxcbiAgICAgICAgICAgIC87IGVuZXJnaXplciAoW1xcdyBdKykoPzogYnVpfFxcKSkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnRW5lcmdpemVyJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLyBDYXRcbiAgICAgICAgICAgIC87IGNhdCAoYjM1KTsvaSxcbiAgICAgICAgICAgIC87IChiMTVxP3xzMjIgZmxpcHxzNDhjfHM2MiBwcm8pKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0NhdCddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gU21hcnRmcmVuXG4gICAgICAgICAgICAvKCg/Om5ldyApP2FuZHJvbWF4W1xcdy0gXSspKD86IGJ1aXxcXCkpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1NtYXJ0ZnJlbiddLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLy8gTm90aGluZ1xuICAgICAgICAgICAgL2Ryb2lkLis7IChhKD86MDE1fDA2WzM1XXwxNDJwPykpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ05vdGhpbmcnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG5cbiAgICAgICAgICAgIC8vIE1JWEVEXG4gICAgICAgICAgICAvKGJsYWNrYmVycnl8YmVucXxwYWxtKD89XFwtKXxzb255ZXJpY3Nzb258YWNlcnxhc3VzfGRlbGx8bWVpenV8bW90b3JvbGF8cG9seXRyb258aW5maW5peHx0ZWNub3xtaWNyb21heHxhZHZhbilbLV8gXT8oWy1cXHddKikvaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxhY2tCZXJyeS9CZW5RL1BhbG0vU29ueS1Fcmljc3Nvbi9BY2VyL0FzdXMvRGVsbC9NZWl6dS9Nb3Rvcm9sYS9Qb2x5dHJvbi9JbmZpbml4L1RlY25vL01pY3JvbWF4L0FkdmFuXG4gICAgICAgICAgICAvOyAoaW1vKSAoKD8hdGFiKVtcXHcgXSs/KSg/OiBidWl8XFwpKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU1PXG4gICAgICAgICAgICAvKGhwKSAoW1xcdyBdK1xcdykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSFAgaVBBUVxuICAgICAgICAgICAgLyhhc3VzKS0/KFxcdyspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXN1c1xuICAgICAgICAgICAgLyhtaWNyb3NvZnQpOyAobHVtaWFbXFx3IF0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWljcm9zb2Z0IEx1bWlhXG4gICAgICAgICAgICAvKGxlbm92bylbLV8gXT8oWy1cXHddKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZW5vdm9cbiAgICAgICAgICAgIC8oam9sbGEpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSm9sbGFcbiAgICAgICAgICAgIC8ob3BwbykgPyhbXFx3IF0rKSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QUE9cbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcblxuICAgICAgICAgICAgLyhpbW8pICh0YWIgXFx3KykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSU1PXG4gICAgICAgICAgICAvKGtvYm8pXFxzKGVyZWFkZXJ8dG91Y2gpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLb2JvXG4gICAgICAgICAgICAvKGFyY2hvcykgKGdhbWVwYWQyPykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFyY2hvc1xuICAgICAgICAgICAgLyhocCkuKyh0b3VjaHBhZCg/IS4rdGFibGV0KXx0YWJsZXQpL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIUCBUb3VjaFBhZFxuICAgICAgICAgICAgLyhraW5kbGUpXFwvKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLaW5kbGVcbiAgICAgICAgICAgIC8obm9vaylbXFx3IF0rYnVpbGRcXC8oXFx3KykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9va1xuICAgICAgICAgICAgLyhkZWxsKSAoc3RyZWFba3ByXFxkIF0qW1xcZGtvXSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGwgU3RyZWFrXG4gICAgICAgICAgICAvKGxlWy0gXStwYW4pWy0gXSsoXFx3ezEsOX0pIGJ1aS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZSBQYW4gVGFibGV0c1xuICAgICAgICAgICAgLyh0cmluaXR5KVstIF0qKHRcXGR7M30pIGJ1aS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpbml0eSBUYWJsZXRzXG4gICAgICAgICAgICAvKGdpZ2FzZXQpWy0gXSsocVxcd3sxLDl9KSBidWkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHaWdhc2V0IFRhYmxldHNcbiAgICAgICAgICAgIC8odm9kYWZvbmUpIChbXFx3IF0rKSg/OlxcKXwgYnVpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWb2RhZm9uZVxuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgW1xuXG4gICAgICAgICAgICAvKHN1cmZhY2UgZHVvKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1cmZhY2UgRHVvXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1JQ1JPU09GVF0sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL2Ryb2lkIFtcXGRcXC5dKzsgKGZwXFxkdT8pKD86IGJ8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpcnBob25lXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdGYWlycGhvbmUnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG4gICAgICAgICAgICAvKHUzMDRhYSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFUJlRcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0FUJlQnXSwgW1RZUEUsIE1PQklMRV1dLCBbXG4gICAgICAgICAgICAvXFxic2llLShcXHcqKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2llbWVuc1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnU2llbWVucyddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIocmN0XFx3KykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSQ0EgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnUkNBJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYih2ZW51ZVtcXGQgXXsyLDd9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGwgVmVudWUgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnRGVsbCddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIocSg/Om12fHRhKVxcdyspIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJpem9uIFRhYmxldFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnVmVyaXpvbiddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoPzpiYXJuZXNbJiBdK25vYmxlIHxibltydF0pKFtcXHdcXCsgXSopIGIvaSAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFybmVzICYgTm9ibGUgVGFibGV0XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdCYXJuZXMgJiBOb2JsZSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIodG1cXGR7M31cXHcrKSBiL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ051VmlzaW9uJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYihrODgpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWlRFIEsgU2VyaWVzIFRhYmxldFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWlRFJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYihueFxcZHszfWopIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpURSBOdWJpYVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWlRFJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYihnZW5cXGR7M30pIGIuKzQ5aC9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXNzIEdFTiBNb2JpbGVcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1N3aXNzJ10sIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYih6dXJcXGR7M30pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN3aXNzIFpVUiBUYWJsZXRcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ1N3aXNzJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYigoemVraSk/dGIuKlxcYikgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFpla2kgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnWmVraSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoW3lyXVxcZHsyfSkgYi9pLFxuICAgICAgICAgICAgL1xcYihkcmFnb25bLSBdK3RvdWNoIHxkdCkoXFx3ezV9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERyYWdvbiBUb3VjaCBUYWJsZXRcbiAgICAgICAgICAgIF0sIFtbVkVORE9SLCAnRHJhZ29uIFRvdWNoJ10sIE1PREVMLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIobnMtP1xcd3swLDl9KSBiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNpZ25pYSBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdJbnNpZ25pYSddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoKG54YXxuZXh0KS0/XFx3ezAsOX0pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXh0Qm9vayBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdOZXh0Qm9vayddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC9cXGIoeHRyZW1lXFxfKT8odigxWzA0NV18MlswMTVdfFszNDY5XTB8N1swNV0pKSBiL2kgICAgICAgICAgICAgICAgICAvLyBWb2ljZSBYdHJlbWUgUGhvbmVzXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgJ1ZvaWNlJ10sIE1PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIobHZ0ZWxcXC0pPyh2MVsxMl0pIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMdlRlbCBQaG9uZXNcbiAgICAgICAgICAgIF0sIFtbVkVORE9SLCAnTHZUZWwnXSwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgL1xcYihwaC0xKSAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNzZW50aWFsIFBILTFcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0Vzc2VudGlhbCddLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9cXGIodigxMDBtZHw3MDBuYXw3MDExfDkxN2cpLipcXGIpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnZpemVuIFRhYmxldHNcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgJ0Vudml6ZW4nXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxiKHRyaW9bLVxcd1xcLiBdKykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hY2hTcGVlZCBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdNYWNoU3BlZWQnXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvXFxidHVfKDE0OTEpIGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3RvciBUYWJsZXRzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdSb3RvciddLCBbVFlQRSwgVEFCTEVUXV0sIFtcbiAgICAgICAgICAgIC8oc2hpZWxkW1xcdyBdKykgYi9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE52aWRpYSBTaGllbGQgVGFibGV0c1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCAnTnZpZGlhJ10sIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgLyhzcHJpbnQpIChcXHcrKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ByaW50IFBob25lc1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBNT0JJTEVdXSwgW1xuICAgICAgICAgICAgLyhraW5cXC5bb25ldHddezN9KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWljcm9zb2Z0IEtpblxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgL1xcLi9nLCAnICddLCBbVkVORE9SLCBNSUNST1NPRlRdLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAoY2M2NjY2P3xldDVbMTZdfG1jWzIzOV1bMjNdeD98dmM4WzAzXXg/KVxcKS9pICAgICAgICAgICAgIC8vIFplYnJhXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFpFQlJBXSwgW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGVjMzB8cHMyMHx0Y1syLThdXFxkW2t4XSlcXCkvaVxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBaRUJSQV0sIFtUWVBFLCBNT0JJTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBTTUFSVFRWU1xuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvc21hcnQtdHYuKyhzYW1zdW5nKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXN1bmdcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9oYmJ0di4rbWFwbGU7KFxcZCspL2lcbiAgICAgICAgICAgIF0sIFtbTU9ERUwsIC9eLywgJ1NtYXJ0VFYnXSwgW1ZFTkRPUiwgU0FNU1VOR10sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC8obnV4OyBuZXRjYXN0LitzbWFydHR2fGxnIChuZXRjYXN0XFwudHYtMjAxXFxkfGFuZHJvaWQgdHYpKS9pICAgICAgICAvLyBMRyBTbWFydFRWXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgTEddLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvKGFwcGxlKSA/dHYvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxlIFRWXG4gICAgICAgICAgICBdLCBbVkVORE9SLCBbTU9ERUwsIEFQUExFKycgVFYnXSwgW1RZUEUsIFNNQVJUVFZdXSwgW1xuICAgICAgICAgICAgL2Nya2V5L2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgXSwgW1tNT0RFTCwgQ0hST01FKydjYXN0J10sIFtWRU5ET1IsIEdPT0dMRV0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rYWZ0KFxcdyspKCBidWl8XFwpKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXJlIFRWXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIEFNQVpPTl0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9cXChkdHZbXFwpO10uKyhhcXVvcykvaSxcbiAgICAgICAgICAgIC8oYXF1b3MtdHZbXFx3IF0rKVxcKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaGFycFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTSEFSUF0sIFtUWVBFLCBTTUFSVFRWXV0sW1xuICAgICAgICAgICAgLyhicmF2aWFbXFx3IF0rKSggYnVpfFxcKSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTb255XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNPTlldLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvKG1pdHYtXFx3ezV9KSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYaWFvbWlcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgWElBT01JXSwgW1RZUEUsIFNNQVJUVFZdXSwgW1xuICAgICAgICAgICAgL0hiYnR2LioodGVjaG5pc2F0KSAoLiopOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZWNobmlTQVRcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgU01BUlRUVl1dLCBbXG4gICAgICAgICAgICAvXFxiKHJva3UpW1xcZHhdKltcXClcXC9dKCg/OmR2cC0pP1tcXGRcXC5dKikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJva3VcbiAgICAgICAgICAgIC9oYmJ0dlxcL1xcZCtcXC5cXGQrXFwuXFxkKyArXFwoW1xcd1xcKyBdKjsgKihbXFx3XFxkXVteO10qKTsoW147XSopL2kgICAgICAgICAvLyBIYmJUViBkZXZpY2VzXG4gICAgICAgICAgICBdLCBbW1ZFTkRPUiwgdHJpbV0sIFtNT0RFTCwgdHJpbV0sIFtUWVBFLCBTTUFSVFRWXV0sIFtcbiAgICAgICAgICAgIC9cXGIoYW5kcm9pZCB0dnxzbWFydFstIF0/dHZ8b3BlcmEgdHZ8dHY7IHJ2OilcXGIvaSAgICAgICAgICAgICAgICAgICAvLyBTbWFydFRWIGZyb20gVW5pZGVudGlmaWVkIFZlbmRvcnNcbiAgICAgICAgICAgIF0sIFtbVFlQRSwgU01BUlRUVl1dLCBbXG5cbiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgIC8vIENPTlNPTEVTXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIC8ob3V5YSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V5YVxuICAgICAgICAgICAgLyhuaW50ZW5kbykgKFt3aWRzM3V0Y2hdKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOaW50ZW5kb1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBDT05TT0xFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAoc2hpZWxkKSBidWkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnZpZGlhXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdOdmlkaWEnXSwgW1RZUEUsIENPTlNPTEVdXSwgW1xuICAgICAgICAgICAgLyhwbGF5c3RhdGlvbiBbMzQ1cG9ydGFibGV2aV0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQbGF5c3RhdGlvblxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBTT05ZXSwgW1RZUEUsIENPTlNPTEVdXSwgW1xuICAgICAgICAgICAgL1xcYih4Ym94KD86IG9uZSk/KD8hOyB4Ym94KSlbXFwpOyBdL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBYYm94XG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIE1JQ1JPU09GVF0sIFtUWVBFLCBDT05TT0xFXV0sIFtcblxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAgICAgLy8gV0VBUkFCTEVTXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIC9cXGIoc20tW2xyXVxcZFxcZFswNV1bZm51d10/cz8pXFxiL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXN1bmcgR2FsYXh5IFdhdGNoXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsIFNBTVNVTkddLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuICAgICAgICAgICAgLygocGViYmxlKSlhcHAvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQZWJibGVcbiAgICAgICAgICAgIF0sIFtWRU5ET1IsIE1PREVMLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuICAgICAgICAgICAgLyh3YXRjaCkoPzogP29zWyxcXC9dfFxcZCxcXGRcXC8pW1xcZFxcLl0rL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsZSBXYXRjaFxuICAgICAgICAgICAgXSwgW01PREVMLCBbVkVORE9SLCBBUFBMRV0sIFtUWVBFLCBXRUFSQUJMRV1dLCBbXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGdsYXNzKSBcXGQvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgR2xhc3NcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgR09PR0xFXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZC4rOyAod3Q2Mz8wezIsM30pXFwpL2lcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgWkVCUkFdLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBYUlxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvZHJvaWQuKzsgKGdsYXNzKSBcXGQvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgR2xhc3NcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgR09PR0xFXSwgW1RZUEUsIFdFQVJBQkxFXV0sIFtcbiAgICAgICAgICAgIC8ocGljbykgKDR8bmVvMyg/OiBsaW5rfHBybyk/KS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGljb1xuICAgICAgICAgICAgXSwgW1ZFTkRPUiwgTU9ERUwsIFtUWVBFLCBXRUFSQUJMRV1dLCBbXG4gICAgICAgICAgICAvOyAocXVlc3QoIFxcZHwgcHJvKT8pL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPY3VsdXMgUXVlc3RcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgRkFDRUJPT0tdLCBbVFlQRSwgV0VBUkFCTEVdXSwgW1xuXG4gICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgICAgICAvLyBFTUJFRERFRFxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvKHRlc2xhKSg/OiBxdGNhcmJyb3dzZXJ8XFwvWy1cXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc2xhXG4gICAgICAgICAgICBdLCBbVkVORE9SLCBbVFlQRSwgRU1CRURERURdXSwgW1xuICAgICAgICAgICAgLyhhZW9iYylcXGIvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRWNobyBEb3RcbiAgICAgICAgICAgIF0sIFtNT0RFTCwgW1ZFTkRPUiwgQU1BWk9OXSwgW1RZUEUsIEVNQkVEREVEXV0sIFtcblxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgIC8vIE1JWEVEIChHRU5FUklDKVxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgICAgICAvZHJvaWQgLis/OyAoW147XSs/KSg/OiBidWl8OyB3dlxcKXxcXCkgYXBwbGV3KS4rPyBtb2JpbGUgc2FmYXJpL2kgICAgLy8gQW5kcm9pZCBQaG9uZXMgZnJvbSBVbmlkZW50aWZpZWQgVmVuZG9yc1xuICAgICAgICAgICAgXSwgW01PREVMLCBbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC9kcm9pZCAuKz87IChbXjtdKz8pKD86IGJ1aXxcXCkgYXBwbGV3KS4rPyg/ISBtb2JpbGUpIHNhZmFyaS9pICAgICAgIC8vIEFuZHJvaWQgVGFibGV0cyBmcm9tIFVuaWRlbnRpZmllZCBWZW5kb3JzXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtUWVBFLCBUQUJMRVRdXSwgW1xuICAgICAgICAgICAgL1xcYigodGFibGV0fHRhYilbO1xcL118Zm9jdXNcXC9cXGQoPyEuK21vYmlsZSkpL2kgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pZGVudGlmaWFibGUgVGFibGV0XG4gICAgICAgICAgICBdLCBbW1RZUEUsIFRBQkxFVF1dLCBbXG4gICAgICAgICAgICAvKHBob25lfG1vYmlsZSg/Ols7XFwvXXwgWyBcXHdcXC9cXC5dKnNhZmFyaSl8cGRhKD89Lit3aW5kb3dzIGNlKSkvaSAgICAvLyBVbmlkZW50aWZpYWJsZSBNb2JpbGVcbiAgICAgICAgICAgIF0sIFtbVFlQRSwgTU9CSUxFXV0sIFtcbiAgICAgICAgICAgIC8oYW5kcm9pZFstXFx3XFwuIF17MCw5fSk7LitidWlsL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmljIEFuZHJvaWQgRGV2aWNlXG4gICAgICAgICAgICBdLCBbTU9ERUwsIFtWRU5ET1IsICdHZW5lcmljJ11dXG4gICAgICAgIF0sXG5cbiAgICAgICAgZW5naW5lIDogW1tcblxuICAgICAgICAgICAgL3dpbmRvd3MuKyBlZGdlXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVkZ2VIVE1MXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEVER0UrJ0hUTUwnXV0sIFtcblxuICAgICAgICAgICAgLyhhcmt3ZWIpXFwvKFtcXHdcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcmtXZWJcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuXG4gICAgICAgICAgICAvd2Via2l0XFwvNTM3XFwuMzYuK2Nocm9tZVxcLyg/ITI3KShbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmxpbmtcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBbTkFNRSwgJ0JsaW5rJ11dLCBbXG5cbiAgICAgICAgICAgIC8ocHJlc3RvKVxcLyhbXFx3XFwuXSspL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJlc3RvXG4gICAgICAgICAgICAvKHdlYmtpdHx0cmlkZW50fG5ldGZyb250fG5ldHN1cmZ8YW1heWF8bHlueHx3M218Z29hbm5hfHNlcnZvKVxcLyhbXFx3XFwuXSspL2ksIC8vIFdlYktpdC9UcmlkZW50L05ldEZyb250L05ldFN1cmYvQW1heWEvTHlueC93M20vR29hbm5hL1NlcnZvXG4gICAgICAgICAgICAvZWtpb2goZmxvdylcXC8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsb3dcbiAgICAgICAgICAgIC8oa2h0bWx8dGFzbWFufGxpbmtzKVtcXC8gXVxcKD8oW1xcd1xcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtIVE1ML1Rhc21hbi9MaW5rc1xuICAgICAgICAgICAgLyhpY2FiKVtcXC8gXShbMjNdXFwuW1xcZFxcLl0rKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaUNhYlxuICAgICAgICAgICAgL1xcYihsaWJ3ZWIpL2lcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuXG4gICAgICAgICAgICAvcnZcXDooW1xcd1xcLl17MSw5fSlcXGIuKyhnZWNrbykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZWNrb1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIE5BTUVdXG4gICAgICAgIF0sXG5cbiAgICAgICAgb3MgOiBbW1xuXG4gICAgICAgICAgICAvLyBXaW5kb3dzXG4gICAgICAgICAgICAvbWljcm9zb2Z0ICh3aW5kb3dzKSAodmlzdGF8eHApL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgKGlUdW5lcylcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXSwgW1xuICAgICAgICAgICAgLyh3aW5kb3dzICg/OnBob25lKD86IG9zKT98bW9iaWxlKSlbXFwvIF0/KFtcXGRcXC5cXHcgXSopL2kgICAgICAgICAgICAgLy8gV2luZG93cyBQaG9uZVxuICAgICAgICAgICAgXSwgW05BTUUsIFtWRVJTSU9OLCBzdHJNYXBwZXIsIHdpbmRvd3NWZXJzaW9uTWFwXV0sIFtcbiAgICAgICAgICAgIC93aW5kb3dzIG50IDZcXC4yOyAoYXJtKS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaW5kb3dzIFJUXG4gICAgICAgICAgICAvd2luZG93c1tcXC8gXT8oW250Y2VcXGRcXC4gXStcXHcpKD8hLit4Ym94KS9pLFxuICAgICAgICAgICAgLyg/Ondpbig/PTN8OXxuKXx3aW4gOXggKShbbnRcXGRcXC5dKykvaVxuICAgICAgICAgICAgXSwgW1tWRVJTSU9OLCBzdHJNYXBwZXIsIHdpbmRvd3NWZXJzaW9uTWFwXSwgW05BTUUsICdXaW5kb3dzJ11dLCBbXG5cbiAgICAgICAgICAgIC8vIGlPUy9tYWNPU1xuICAgICAgICAgICAgL2lwW2hvbmVhZF17Miw0fVxcYig/Oi4qb3MgKFtcXHddKykgbGlrZSBtYWN8OyBvcGVyYSkvaSwgICAgICAgICAgICAgIC8vIGlPU1xuICAgICAgICAgICAgLyg/OmlvcztmYnN2XFwvfGlwaG9uZS4raW9zW1xcLyBdKShbXFxkXFwuXSspL2ksXG4gICAgICAgICAgICAvY2ZuZXR3b3JrXFwvLitkYXJ3aW4vaVxuICAgICAgICAgICAgXSwgW1tWRVJTSU9OLCAvXy9nLCAnLiddLCBbTkFNRSwgJ2lPUyddXSwgW1xuICAgICAgICAgICAgLyhtYWMgb3MgeCkgPyhbXFx3XFwuIF0qKS9pLFxuICAgICAgICAgICAgLyhtYWNpbnRvc2h8bWFjX3Bvd2VycGNcXGIpKD8hLitoYWlrdSkvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFjIE9TXG4gICAgICAgICAgICBdLCBbW05BTUUsIE1BQ19PU10sIFtWRVJTSU9OLCAvXy9nLCAnLiddXSwgW1xuXG4gICAgICAgICAgICAvLyBNb2JpbGUgT1Nlc1xuICAgICAgICAgICAgL2Ryb2lkIChbXFx3XFwuXSspXFxiLisoYW5kcm9pZFstIF14ODZ8aGFybW9ueW9zKS9pICAgICAgICAgICAgICAgICAgICAvLyBBbmRyb2lkLXg4Ni9IYXJtb255T1NcbiAgICAgICAgICAgIF0sIFtWRVJTSU9OLCBOQU1FXSwgWyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW5kcm9pZC9XZWJPUy9RTlgvQmFkYS9SSU0vTWFlbW8vTWVlR28vU2FpbGZpc2ggT1MvT3Blbkhhcm1vbnlcbiAgICAgICAgICAgIC8oYW5kcm9pZHx3ZWJvc3xxbnh8YmFkYXxyaW0gdGFibGV0IG9zfG1hZW1vfG1lZWdvfHNhaWxmaXNofG9wZW5oYXJtb255KVstXFwvIF0/KFtcXHdcXC5dKikvaSxcbiAgICAgICAgICAgIC8oYmxhY2tiZXJyeSlcXHcqXFwvKFtcXHdcXC5dKikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJsYWNrYmVycnlcbiAgICAgICAgICAgIC8odGl6ZW58a2Fpb3MpW1xcLyBdKFtcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGl6ZW4vS2FpT1NcbiAgICAgICAgICAgIC9cXCgoc2VyaWVzNDApOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlcmllcyA0MFxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvXFwoYmIoMTApOy9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCbGFja0JlcnJ5IDEwXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEJMQUNLQkVSUlldXSwgW1xuICAgICAgICAgICAgLyg/OnN5bWJpYW4gP29zfHN5bWJvc3xzNjAoPz07KXxzZXJpZXM2MClbLVxcLyBdPyhbXFx3XFwuXSopL2kgICAgICAgICAvLyBTeW1iaWFuXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsICdTeW1iaWFuJ11dLCBbXG4gICAgICAgICAgICAvbW96aWxsYVxcL1tcXGRcXC5dKyBcXCgoPzptb2JpbGV8dGFibGV0fHR2fG1vYmlsZTsgW1xcdyBdKyk7IHJ2Oi4rIGdlY2tvXFwvKFtcXHdcXC5dKykvaSAvLyBGaXJlZm94IE9TXG4gICAgICAgICAgICBdLCBbVkVSU0lPTiwgW05BTUUsIEZJUkVGT1grJyBPUyddXSwgW1xuICAgICAgICAgICAgL3dlYjBzOy4rcnQodHYpL2ksXG4gICAgICAgICAgICAvXFxiKD86aHApP3dvcyg/OmJyb3dzZXIpP1xcLyhbXFx3XFwuXSspL2kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZWJPU1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnd2ViT1MnXV0sIFtcbiAgICAgICAgICAgIC93YXRjaCg/OiA/b3NbLFxcL118XFxkLFxcZFxcLykoW1xcZFxcLl0rKS9pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2F0Y2hPU1xuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCAnd2F0Y2hPUyddXSwgW1xuXG4gICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgL2Nya2V5XFwvKFtcXGRcXC5dKykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lY2FzdFxuICAgICAgICAgICAgXSwgW1ZFUlNJT04sIFtOQU1FLCBDSFJPTUUrJ2Nhc3QnXV0sIFtcbiAgICAgICAgICAgIC8oY3JvcykgW1xcd10rKD86XFwpfCAoW1xcd1xcLl0rKVxcYikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaHJvbWl1bSBPU1xuICAgICAgICAgICAgXSwgW1tOQU1FLCBDSFJPTUlVTV9PU10sIFZFUlNJT05dLFtcblxuICAgICAgICAgICAgLy8gU21hcnQgVFZzXG4gICAgICAgICAgICAvcGFuYXNvbmljOyh2aWVyYSkvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhbmFzb25pYyBWaWVyYVxuICAgICAgICAgICAgLyhuZXRyYW5nZSltbWgvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZXRyYW5nZVxuICAgICAgICAgICAgLyhuZXR0dilcXC8oXFxkK1xcLltcXHdcXC5dKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5ldFRWXG5cbiAgICAgICAgICAgIC8vIENvbnNvbGVcbiAgICAgICAgICAgIC8obmludGVuZG98cGxheXN0YXRpb24pIChbd2lkczM0NXBvcnRhYmxldnVjaF0rKS9pLCAgICAgICAgICAgICAgICAgLy8gTmludGVuZG8vUGxheXN0YXRpb25cbiAgICAgICAgICAgIC8oeGJveCk7ICt4Ym94IChbXlxcKTtdKykvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pY3Jvc29mdCBYYm94ICgzNjAsIE9uZSwgWCwgUywgU2VyaWVzIFgsIFNlcmllcyBTKVxuXG4gICAgICAgICAgICAvLyBPdGhlclxuICAgICAgICAgICAgL1xcYihqb2xpfHBhbG0pXFxiID8oPzpvcyk/XFwvPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpvbGkvUGFsbVxuICAgICAgICAgICAgLyhtaW50KVtcXC9cXChcXCkgXT8oXFx3KikvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWludFxuICAgICAgICAgICAgLyhtYWdlaWF8dmVjdG9ybGludXgpWzsgXS9pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWdlaWEvVmVjdG9yTGludXhcbiAgICAgICAgICAgIC8oW2t4bG5dP3VidW50dXxkZWJpYW58c3VzZXxvcGVuc3VzZXxnZW50b298YXJjaCg/PSBsaW51eCl8c2xhY2t3YXJlfGZlZG9yYXxtYW5kcml2YXxjZW50b3N8cGNsaW51eG9zfHJlZCA/aGF0fHplbndhbGt8bGlucHVzfHJhc3BiaWFufHBsYW4gOXxtaW5peHxyaXNjIG9zfGNvbnRpa2l8ZGVlcGlufG1hbmphcm98ZWxlbWVudGFyeSBvc3xzYWJheW9ufGxpbnNwaXJlKSg/OiBnbnVcXC9saW51eCk/KD86IGVudGVycHJpc2UpPyg/OlstIF1saW51eCk/KD86LWdudSk/Wy1cXC8gXT8oPyFjaHJvbXxwYWNrYWdlKShbLVxcd1xcLl0qKS9pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVYnVudHUvRGViaWFuL1NVU0UvR2VudG9vL0FyY2gvU2xhY2t3YXJlL0ZlZG9yYS9NYW5kcml2YS9DZW50T1MvUENMaW51eE9TL1JlZEhhdC9aZW53YWxrL0xpbnB1cy9SYXNwYmlhbi9QbGFuOS9NaW5peC9SSVNDT1MvQ29udGlraS9EZWVwaW4vTWFuamFyby9lbGVtZW50YXJ5L1NhYmF5b24vTGluc3BpcmVcbiAgICAgICAgICAgIC8oaHVyZHxsaW51eCkgPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIdXJkL0xpbnV4XG4gICAgICAgICAgICAvKGdudSkgPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR05VXG4gICAgICAgICAgICAvXFxiKFstZnJlbnRvcGNnaHNdezAsNX1ic2R8ZHJhZ29uZmx5KVtcXC8gXT8oPyFhbWR8W2l4MzQ2XXsxLDJ9ODYpKFtcXHdcXC5dKikvaSwgLy8gRnJlZUJTRC9OZXRCU0QvT3BlbkJTRC9QQy1CU0QvR2hvc3RCU0QvRHJhZ29uRmx5XG4gICAgICAgICAgICAvKGhhaWt1KSAoXFx3KykvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYWlrdVxuICAgICAgICAgICAgXSwgW05BTUUsIFZFUlNJT05dLCBbXG4gICAgICAgICAgICAvKHN1bm9zKSA/KFtcXHdcXC5cXGRdKikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvbGFyaXNcbiAgICAgICAgICAgIF0sIFtbTkFNRSwgJ1NvbGFyaXMnXSwgVkVSU0lPTl0sIFtcbiAgICAgICAgICAgIC8oKD86b3Blbik/c29sYXJpcylbLVxcLyBdPyhbXFx3XFwuXSopL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29sYXJpc1xuICAgICAgICAgICAgLyhhaXgpICgoXFxkKSg/PVxcLnxcXCl8IClbXFx3XFwuXSkqL2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJWFxuICAgICAgICAgICAgL1xcYihiZW9zfG9zXFwvMnxhbWlnYW9zfG1vcnBob3N8b3BlbnZtc3xmdWNoc2lhfGhwLXV4fHNlcmVuaXR5b3MpL2ksIC8vIEJlT1MvT1MyL0FtaWdhT1MvTW9ycGhPUy9PcGVuVk1TL0Z1Y2hzaWEvSFAtVVgvU2VyZW5pdHlPU1xuICAgICAgICAgICAgLyh1bml4KSA/KFtcXHdcXC5dKikvaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVOSVhcbiAgICAgICAgICAgIF0sIFtOQU1FLCBWRVJTSU9OXVxuICAgICAgICBdXG4gICAgfTtcblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQ29uc3RydWN0b3JcbiAgICAvLy8vLy8vLy8vLy8vLy8vXG5cbiAgICB2YXIgVUFQYXJzZXIgPSBmdW5jdGlvbiAodWEsIGV4dGVuc2lvbnMpIHtcblxuICAgICAgICBpZiAodHlwZW9mIHVhID09PSBPQkpfVFlQRSkge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IHVhO1xuICAgICAgICAgICAgdWEgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVUFQYXJzZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVBUGFyc2VyKHVhLCBleHRlbnNpb25zKS5nZXRSZXN1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbmF2aWdhdG9yID0gKHR5cGVvZiB3aW5kb3cgIT09IFVOREVGX1RZUEUgJiYgd2luZG93Lm5hdmlnYXRvcikgPyB3aW5kb3cubmF2aWdhdG9yIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX3VhID0gdWEgfHwgKChfbmF2aWdhdG9yICYmIF9uYXZpZ2F0b3IudXNlckFnZW50KSA/IF9uYXZpZ2F0b3IudXNlckFnZW50IDogRU1QVFkpO1xuICAgICAgICB2YXIgX3VhY2ggPSAoX25hdmlnYXRvciAmJiBfbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEpID8gX25hdmlnYXRvci51c2VyQWdlbnREYXRhIDogdW5kZWZpbmVkO1xuICAgICAgICB2YXIgX3JneG1hcCA9IGV4dGVuc2lvbnMgPyBleHRlbmQocmVnZXhlcywgZXh0ZW5zaW9ucykgOiByZWdleGVzO1xuICAgICAgICB2YXIgX2lzU2VsZk5hdiA9IF9uYXZpZ2F0b3IgJiYgX25hdmlnYXRvci51c2VyQWdlbnQgPT0gX3VhO1xuXG4gICAgICAgIHRoaXMuZ2V0QnJvd3NlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfYnJvd3NlciA9IHt9O1xuICAgICAgICAgICAgX2Jyb3dzZXJbTkFNRV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBfYnJvd3NlcltWRVJTSU9OXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJneE1hcHBlci5jYWxsKF9icm93c2VyLCBfdWEsIF9yZ3htYXAuYnJvd3Nlcik7XG4gICAgICAgICAgICBfYnJvd3NlcltNQUpPUl0gPSBtYWpvcml6ZShfYnJvd3NlcltWRVJTSU9OXSk7XG4gICAgICAgICAgICAvLyBCcmF2ZS1zcGVjaWZpYyBkZXRlY3Rpb25cbiAgICAgICAgICAgIGlmIChfaXNTZWxmTmF2ICYmIF9uYXZpZ2F0b3IgJiYgX25hdmlnYXRvci5icmF2ZSAmJiB0eXBlb2YgX25hdmlnYXRvci5icmF2ZS5pc0JyYXZlID09IEZVTkNfVFlQRSkge1xuICAgICAgICAgICAgICAgIF9icm93c2VyW05BTUVdID0gJ0JyYXZlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfYnJvd3NlcjtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRDUFUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2NwdSA9IHt9O1xuICAgICAgICAgICAgX2NwdVtBUkNISVRFQ1RVUkVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX2NwdSwgX3VhLCBfcmd4bWFwLmNwdSk7XG4gICAgICAgICAgICByZXR1cm4gX2NwdTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2RldmljZSA9IHt9O1xuICAgICAgICAgICAgX2RldmljZVtWRU5ET1JdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgX2RldmljZVtNT0RFTF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBfZGV2aWNlW1RZUEVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX2RldmljZSwgX3VhLCBfcmd4bWFwLmRldmljZSk7XG4gICAgICAgICAgICBpZiAoX2lzU2VsZk5hdiAmJiAhX2RldmljZVtUWVBFXSAmJiBfdWFjaCAmJiBfdWFjaC5tb2JpbGUpIHtcbiAgICAgICAgICAgICAgICBfZGV2aWNlW1RZUEVdID0gTU9CSUxFO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaVBhZE9TLXNwZWNpZmljIGRldGVjdGlvbjogaWRlbnRpZmllZCBhcyBNYWMsIGJ1dCBoYXMgc29tZSBpT1Mtb25seSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoX2lzU2VsZk5hdiAmJiBfZGV2aWNlW01PREVMXSA9PSAnTWFjaW50b3NoJyAmJiBfbmF2aWdhdG9yICYmIHR5cGVvZiBfbmF2aWdhdG9yLnN0YW5kYWxvbmUgIT09IFVOREVGX1RZUEUgJiYgX25hdmlnYXRvci5tYXhUb3VjaFBvaW50cyAmJiBfbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMikge1xuICAgICAgICAgICAgICAgIF9kZXZpY2VbTU9ERUxdID0gJ2lQYWQnO1xuICAgICAgICAgICAgICAgIF9kZXZpY2VbVFlQRV0gPSBUQUJMRVQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX2RldmljZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRFbmdpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2VuZ2luZSA9IHt9O1xuICAgICAgICAgICAgX2VuZ2luZVtOQU1FXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIF9lbmdpbmVbVkVSU0lPTl0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZ3hNYXBwZXIuY2FsbChfZW5naW5lLCBfdWEsIF9yZ3htYXAuZW5naW5lKTtcbiAgICAgICAgICAgIHJldHVybiBfZW5naW5lO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldE9TID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9vcyA9IHt9O1xuICAgICAgICAgICAgX29zW05BTUVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgX29zW1ZFUlNJT05dID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmd4TWFwcGVyLmNhbGwoX29zLCBfdWEsIF9yZ3htYXAub3MpO1xuICAgICAgICAgICAgaWYgKF9pc1NlbGZOYXYgJiYgIV9vc1tOQU1FXSAmJiBfdWFjaCAmJiBfdWFjaC5wbGF0Zm9ybSAmJiBfdWFjaC5wbGF0Zm9ybSAhPSAnVW5rbm93bicpIHtcbiAgICAgICAgICAgICAgICBfb3NbTkFNRV0gPSBfdWFjaC5wbGF0Zm9ybSAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvY2hyb21lIG9zL2ksIENIUk9NSVVNX09TKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL21hY29zL2ksIE1BQ19PUyk7ICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX29zO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmdldFJlc3VsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdWEgICAgICA6IHRoaXMuZ2V0VUEoKSxcbiAgICAgICAgICAgICAgICBicm93c2VyIDogdGhpcy5nZXRCcm93c2VyKCksXG4gICAgICAgICAgICAgICAgZW5naW5lICA6IHRoaXMuZ2V0RW5naW5lKCksXG4gICAgICAgICAgICAgICAgb3MgICAgICA6IHRoaXMuZ2V0T1MoKSxcbiAgICAgICAgICAgICAgICBkZXZpY2UgIDogdGhpcy5nZXREZXZpY2UoKSxcbiAgICAgICAgICAgICAgICBjcHUgICAgIDogdGhpcy5nZXRDUFUoKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5nZXRVQSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfdWE7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0VUEgPSBmdW5jdGlvbiAodWEpIHtcbiAgICAgICAgICAgIF91YSA9ICh0eXBlb2YgdWEgPT09IFNUUl9UWVBFICYmIHVhLmxlbmd0aCA+IFVBX01BWF9MRU5HVEgpID8gdHJpbSh1YSwgVUFfTUFYX0xFTkdUSCkgOiB1YTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldFVBKF91YSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBVQVBhcnNlci5WRVJTSU9OID0gTElCVkVSU0lPTjtcbiAgICBVQVBhcnNlci5CUk9XU0VSID0gIGVudW1lcml6ZShbTkFNRSwgVkVSU0lPTiwgTUFKT1JdKTtcbiAgICBVQVBhcnNlci5DUFUgPSBlbnVtZXJpemUoW0FSQ0hJVEVDVFVSRV0pO1xuICAgIFVBUGFyc2VyLkRFVklDRSA9IGVudW1lcml6ZShbTU9ERUwsIFZFTkRPUiwgVFlQRSwgQ09OU09MRSwgTU9CSUxFLCBTTUFSVFRWLCBUQUJMRVQsIFdFQVJBQkxFLCBFTUJFRERFRF0pO1xuICAgIFVBUGFyc2VyLkVOR0lORSA9IFVBUGFyc2VyLk9TID0gZW51bWVyaXplKFtOQU1FLCBWRVJTSU9OXSk7XG5cbiAgICAvLy8vLy8vLy8vL1xuICAgIC8vIEV4cG9ydFxuICAgIC8vLy8vLy8vLy9cblxuICAgIC8vIGNoZWNrIGpzIGVudmlyb25tZW50XG4gICAgaWYgKHR5cGVvZihleHBvcnRzKSAhPT0gVU5ERUZfVFlQRSkge1xuICAgICAgICAvLyBub2RlanMgZW52XG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBVTkRFRl9UWVBFICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBVQVBhcnNlcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRzLlVBUGFyc2VyID0gVUFQYXJzZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVxdWlyZWpzIGVudiAob3B0aW9uYWwpXG4gICAgICAgIGlmICh0eXBlb2YoZGVmaW5lKSA9PT0gRlVOQ19UWVBFICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgICAgIGRlZmluZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVBUGFyc2VyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gVU5ERUZfVFlQRSkge1xuICAgICAgICAgICAgLy8gYnJvd3NlciBlbnZcbiAgICAgICAgICAgIHdpbmRvdy5VQVBhcnNlciA9IFVBUGFyc2VyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8galF1ZXJ5L1plcHRvIHNwZWNpZmljIChvcHRpb25hbClcbiAgICAvLyBOb3RlOlxuICAgIC8vICAgSW4gQU1EIGVudiB0aGUgZ2xvYmFsIHNjb3BlIHNob3VsZCBiZSBrZXB0IGNsZWFuLCBidXQgalF1ZXJ5IGlzIGFuIGV4Y2VwdGlvbi5cbiAgICAvLyAgIGpRdWVyeSBhbHdheXMgZXhwb3J0cyB0byBnbG9iYWwgc2NvcGUsIHVubGVzcyBqUXVlcnkubm9Db25mbGljdCh0cnVlKSBpcyB1c2VkLFxuICAgIC8vICAgYW5kIHdlIHNob3VsZCBjYXRjaCB0aGF0LlxuICAgIHZhciAkID0gdHlwZW9mIHdpbmRvdyAhPT0gVU5ERUZfVFlQRSAmJiAod2luZG93LmpRdWVyeSB8fCB3aW5kb3cuWmVwdG8pO1xuICAgIGlmICgkICYmICEkLnVhKSB7XG4gICAgICAgIHZhciBwYXJzZXIgPSBuZXcgVUFQYXJzZXIoKTtcbiAgICAgICAgJC51YSA9IHBhcnNlci5nZXRSZXN1bHQoKTtcbiAgICAgICAgJC51YS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VyLmdldFVBKCk7XG4gICAgICAgIH07XG4gICAgICAgICQudWEuc2V0ID0gZnVuY3Rpb24gKHVhKSB7XG4gICAgICAgICAgICBwYXJzZXIuc2V0VUEodWEpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHBhcnNlci5nZXRSZXN1bHQoKTtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgJC51YVtwcm9wXSA9IHJlc3VsdFtwcm9wXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbn0pKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnID8gd2luZG93IDogdGhpcyk7XG4iXX0=