@cqa-lib/cqa-ui 1.1.526 → 1.1.528
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.
- package/esm2020/lib/simulator/simulator.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-group/step-builder-group.component.mjs +22 -7
- package/fesm2015/cqa-lib-cqa-ui.mjs +18 -4
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +18 -4
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-group/step-builder-group.component.d.ts +10 -1
- package/package.json +1 -1
- package/styles.css +1 -1
|
@@ -2380,10 +2380,10 @@ export class SimulatorComponent {
|
|
|
2380
2380
|
}
|
|
2381
2381
|
}
|
|
2382
2382
|
SimulatorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2383
|
-
SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig", showVideoLibrary: "showVideoLibrary", showCaptureVideo: "showCaptureVideo", isCapturingVideo: "isCapturingVideo", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }, { propertyName: "clipsScrollerRef", first: true, predicate: ["clipsScroller"], descendants: true }, { propertyName: "clipVideos", predicate: ["clipVideo"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control\n [segments]=\"segments\"\n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n\n <div *ngIf=\"!isFullScreen\"\n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i5.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
2383
|
+
SimulatorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: SimulatorComponent, selector: "cqa-simulator", inputs: { videoUrl: "videoUrl", videoUrls: "videoUrls", videoCurrentDuration: "videoCurrentDuration", stepMarkers: "stepMarkers", screenShotUrl: "screenShotUrl", traceViewUrl: "traceViewUrl", platformName: "platformName", platformType: "platformType", platform: "platform", deviceName: "deviceName", isLive: "isLive", liveStatus: "liveStatus", liveLoadingLabel: "liveLoadingLabel", isContentVideoLoading: "isContentVideoLoading", failedStatusMessage: "failedStatusMessage", isVNCSessionIntruppted: "isVNCSessionIntruppted", vncSessionIntupptedMessage: "vncSessionIntupptedMessage", selectedView: "selectedView", hideVideoTab: "hideVideoTab", browserViewPort: "browserViewPort", browserDevice: "browserDevice", isFastForwarding: "isFastForwarding", fastForwardConfig: "fastForwardConfig", showVideoLibrary: "showVideoLibrary", showCaptureVideo: "showCaptureVideo", isCapturingVideo: "isCapturingVideo", liveSessionView: "liveSessionView" }, outputs: { videoTimeUpdate: "videoTimeUpdate", videoPlay: "videoPlay", videoPause: "videoPause", markerHit: "markerHit", isVideoPlayingChange: "isVideoPlayingChange", captureVideoRequested: "captureVideoRequested", liveSessionViewChange: "liveSessionViewChange" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "vplayerRef", first: true, predicate: ["vplayer"], descendants: true }, { propertyName: "timelineBarRef", first: true, predicate: ["timelineBar"], descendants: true }, { propertyName: "speedControlContainerRef", first: true, predicate: ["speedControlContainer"], descendants: true }, { propertyName: "clipsScrollerRef", first: true, predicate: ["clipsScroller"], descendants: true }, { propertyName: "clipVideos", predicate: ["clipVideo"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control\n [segments]=\"segments\"\n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n\n <div *ngIf=\"!isFullScreen\"\n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor", "fullWidth", "size"], outputs: ["valueChange"] }, { type: i4.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { type: i5.BadgeComponent, selector: "cqa-badge", inputs: ["type", "label", "icon", "iconLibrary", "variant", "size", "backgroundColor", "textColor", "borderColor", "iconBackgroundColor", "iconColor", "iconSize", "inlineStyles", "key", "value", "keyTextColor", "valueTextColor", "isLoading", "fullWidth", "centerContent", "title"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
2384
2384
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: SimulatorComponent, decorators: [{
|
|
2385
2385
|
type: Component,
|
|
2386
|
-
args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control\n [segments]=\"segments\"\n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n\n <div *ngIf=\"!isFullScreen\"\n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 {{ fastForwardConfig.targetStepLabel }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
|
|
2386
|
+
args: [{ selector: 'cqa-simulator', template: "<div class=\"cqa-ui-root\" style=\"background-color: #F3F4F6; height: 100%; display: flex; flex-direction: column;\" [ngStyle]=\"{\n position: isFullScreen ? 'fixed' : null,\n inset: isFullScreen ? '1rem' : null,\n zIndex: isFullScreen ? '50' : null,\n boxShadow: isFullScreen ? '0px 13px 25px -12px rgba(0, 0, 0, 0.25)' : null,\n borderRadius: isFullScreen ? '.5rem' : null,\n border: isFullScreen ? '1px solid #E5E7EB' : null,\n width: isFullScreen ? 'calc(100% - 32px)' : null,\n height: isFullScreen ? 'calc(100% - 32px)' : '100%',\n overflow: isFullScreen ? 'hidden' : null\n}\">\n <div class=\"cqa-w-full cqa-py-1 cqa-px-2 cqa-bg-[#FFFFFF]\" style=\"border-bottom: 1px solid #E5E7EB;box-shadow: 0px 1px 2px 0px #0000000D;\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center cqa-justify-between cqa-flex-wrap\">\n <div class=\"cqa-flex cqa-items-center\">\n <div *ngIf=\"isLive\" class=\"cqa-h-[21px] cqa-inline-flex cqa-items-center cqa-gap-1.5 cqa-mr-2 cqa-px-[9px] cqa-py-[3px] cqa-bg-[#FCD9D9] cqa-rounded-[6px]\" style=\"border: 1px solid #F9BFBF;\">\n <span class=\"cqa-relative cqa-w-2 cqa-h-2 cqa-rounded-full cqa-bg-[#F47F7F]\" style=\"flex-shrink: 0;\">\n <span class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-bg-[#F47F7F] cqa-opacity-75 cqa-animate-ping\"></span>\n </span>\n <span class=\"cqa-text-[10px] cqa-font-medium cqa-text-[#C63535] cqa-leading-[15px]\">Live</span>\n </div>\n <mat-icon *ngIf=\"effectivePlatformType === 'browser'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <g clip-path=\"url(#clip0_935_15847)\">\n <path\n d=\"M0.625 5C0.625 6.16032 1.08594 7.27312 1.90641 8.09359C2.72688 8.91406 3.83968 9.375 5 9.375C6.16032 9.375 7.27312 8.91406 8.09359 8.09359C8.91406 7.27312 9.375 6.16032 9.375 5C9.375 3.83968 8.91406 2.72688 8.09359 1.90641C7.27312 1.08594 6.16032 0.625 5 0.625C3.83968 0.625 2.72688 1.08594 1.90641 1.90641C1.08594 2.72688 0.625 3.83968 0.625 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path\n d=\"M3.125 5C3.125 3.83968 3.32254 2.72688 3.67417 1.90641C4.02581 1.08594 4.50272 0.625 5 0.625C5.49728 0.625 5.97419 1.08594 6.32582 1.90641C6.67746 2.72688 6.875 3.83968 6.875 5C6.875 6.16032 6.67746 7.27312 6.32582 8.09359C5.97419 8.91406 5.49728 9.375 5 9.375C4.50272 9.375 4.02581 8.91406 3.67417 8.09359C3.32254 7.27312 3.125 6.16032 3.125 5Z\"\n stroke=\"#9CA3AF\" stroke-width=\"0.6\" stroke-linejoin=\"round\" />\n <path d=\"M0.9375 6.45866H9.0625M0.9375 3.54199H9.0625\" stroke=\"#9CA3AF\" stroke-width=\"0.6\"\n stroke-linecap=\"round\" />\n </g>\n <defs>\n <clipPath id=\"clip0_935_15847\">\n <rect width=\"10\" height=\"10\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"effectivePlatformType === 'device'\" style=\"width: 10px; height: 10px;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M7.08325 0.833008H2.91659C2.45635 0.833008 2.08325 1.2061 2.08325 1.66634V8.33301C2.08325 8.79324 2.45635 9.16634 2.91659 9.16634H7.08325C7.54349 9.16634 7.91658 8.79324 7.91658 8.33301V1.66634C7.91658 1.2061 7.54349 0.833008 7.08325 0.833008Z\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M5 7.5H5.00417\" stroke=\"#6B7280\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <p class=\"cqa-text-sm !cqa-text-[10px] cqa-text-[#6B7280] cqa-ml-2\">\n {{ platformName }}\n <span\n *ngIf=\"effectivePlatformType === 'browser'\"\n class=\"cqa-ml-1\"\n [matTooltip]=\"'Screen size: ' + effectiveBrowserViewPort.width + 'x' + effectiveBrowserViewPort.height\"\n matTooltipPosition=\"below\"\n >\n \u00B7\n <span class=\"cqa-ml-1\">\n {{ effectiveBrowserViewPort.width }}x{{ effectiveBrowserViewPort.height }}\n </span>\n </span>\n </p>\n <button\n *ngIf=\"showCaptureVideo && isLive\"\n type=\"button\"\n class=\"capture-video-btn\"\n [class.is-loading]=\"isCapturingVideo\"\n [disabled]=\"isCapturingVideo\"\n (click)=\"captureVideo()\">\n <span *ngIf=\"!isCapturingVideo\" class=\"capture-video-btn__dot\"></span>\n <span *ngIf=\"isCapturingVideo\" class=\"capture-video-btn__spinner\" aria-hidden=\"true\"></span>\n <span>{{ isCapturingVideo ? 'Capturing\u2026' : 'Capture Video' }}</span>\n </button>\n </div>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <div *ngIf=\"isLive\" [ngClass]=\"getStatusBadgeClass()\">\n <span [ngClass]=\"getStatusTextClass()\">{{ liveStatus }}</span>\n </div>\n\n <cqa-segment-control\n *ngIf=\"isLive && videoUrls && videoUrls.length > 0\"\n [segments]=\"liveSessionSegments\"\n [value]=\"liveSessionView\"\n (valueChange)=\"onLiveSessionViewChange($event)\">\n </cqa-segment-control>\n\n <ng-container *ngIf=\"!isLive\">\n <cqa-segment-control\n [segments]=\"segments\"\n [value]=\"currentView\"\n (valueChange)=\"onSegmentChange($event)\">\n </cqa-segment-control>\n\n <div *ngIf=\"!isFullScreen\"\n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Expand\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M6.25 1.25H8.75V3.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.74992 1.25L5.83325 4.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 8.74967L4.16667 5.83301\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M3.75 8.75H1.25V6.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <div *ngIf=\"isFullScreen\" \n class=\"cqa-p-1 cqa-cursor-pointer hover:cqa-bg-gray-100 cqa-rounded-sm cqa-transition-colors\"\n (click)=\"toggleFullScreen()\"\n title=\"Exit full screen\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\">\n <path d=\"M8.75 6.25H6.25V8.75\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.25008 6.25L9.16675 9.16667\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M0.833252 0.833008L3.74992 3.74967\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M1.25 3.75H3.75V1.25\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"cqa-w-full cqa-bg-[#F3F4F6] cqa-h-[calc(100%-41px)]\">\n <!-- Fast-forward overlay: covers content area but not header -->\n <div *ngIf=\"isFastForwarding && fastForwardConfig\"\n class=\"cqa-h-full cqa-w-full cqa-flex cqa-items-center cqa-justify-center cqa-p-6\"\n style=\"background-color: #F3F4F6;\">\n <div class=\"cqa-bg-white cqa-rounded-xl cqa-w-full\"\n style=\"max-width: 500px; padding: 32px; box-shadow: 0px 25px 50px -12px #00000040; border: 1px solid #E5E5E5\">\n <!-- Sparkle avatar with rotating arc -->\n <div class=\"cqa-flex cqa-justify-center cqa-mb-2\">\n <div class=\"cqa-relative\" style=\"width: 56px; height: 56px;\">\n <div class=\"cqa-absolute cqa-inset-0 cqa-rounded-full cqa-flex cqa-items-center cqa-justify-center\"\n style=\"background-color: rgba(63,67,238,0.12);\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"26\" viewBox=\"0 0 24 26\" fill=\"none\">\n <path d=\"M12.0251 0C12.173 0.0634121 12.2362 0.218264 12.2968 0.36211C12.3272 0.445923 12.355 0.530192 12.3821 0.615133C12.3927 0.647682 12.4033 0.680231 12.4142 0.713766C12.5548 1.15177 12.6801 1.59447 12.8061 2.03686C12.8346 2.13673 12.8632 2.23656 12.8918 2.33638C13.0375 2.84464 13.1821 3.35321 13.3258 3.86201C13.346 3.93347 13.3662 4.00492 13.3864 4.07638C13.4434 4.27783 13.5003 4.4793 13.5569 4.68087C13.6764 5.10678 13.7993 5.53145 13.9301 5.95405C13.9415 5.99102 13.9529 6.02799 13.9647 6.06608C14.3045 7.15318 14.7862 8.12751 15.5757 8.95743C15.5953 8.979 15.6148 9.00058 15.635 9.02282C15.972 9.38246 16.4045 9.67063 16.8368 9.90322C16.8588 9.91526 16.8808 9.92729 16.9035 9.9397C18.1757 10.6231 19.7053 10.9237 21.0832 11.3238C21.6869 11.4992 22.2888 11.6802 22.8885 11.8691C22.9306 11.8823 22.9727 11.8956 23.0149 11.9088C23.1409 11.9483 23.2667 11.9885 23.3923 12.0293C23.4216 12.0385 23.4509 12.0478 23.481 12.0573C23.6541 12.1146 23.8197 12.1821 23.9618 12.2992C24.0051 12.3938 24.0051 12.3938 23.9933 12.4884C23.855 12.6258 23.7179 12.6902 23.5354 12.753C23.5093 12.7623 23.4832 12.7716 23.4564 12.7811C23.1483 12.8892 22.836 12.9838 22.5234 13.0775C22.4592 13.0969 22.395 13.1163 22.3309 13.1357C21.9352 13.2551 21.5389 13.3719 21.1421 13.4874C20.6195 13.6395 20.0977 13.7942 19.5763 13.9506C19.4909 13.9763 19.4055 14.0018 19.32 14.0272C18.8712 14.161 18.4246 14.2995 17.9817 14.4516C17.945 14.4642 17.9082 14.4768 17.8704 14.4897C16.387 15.0059 15.2563 15.9687 14.5486 17.3768C14.167 18.1681 13.9419 19.0239 13.7124 19.8685C13.6503 20.0964 13.5842 20.323 13.5175 20.5496C13.4651 20.7278 13.4139 20.9064 13.364 21.0853C13.358 21.1066 13.3521 21.1279 13.346 21.1499C13.3172 21.253 13.2885 21.3562 13.26 21.4594C13.1872 21.7211 13.1087 21.9807 13.0281 22.2401C12.8851 22.7012 12.7549 23.1656 12.6256 23.6306C12.4305 24.3308 12.4305 24.3308 12.3199 24.6674C12.3126 24.69 12.3052 24.7126 12.2977 24.7359C12.2573 24.8557 12.2158 24.966 12.1394 25.0674C12.0231 25.093 12.0231 25.093 11.9187 25.0989C11.7993 24.9249 11.7202 24.7562 11.6569 24.5553C11.6476 24.5269 11.6384 24.4984 11.6289 24.4691C11.5116 24.1019 11.4067 23.7309 11.3018 23.36C11.2778 23.2752 11.2536 23.1904 11.2295 23.1056C11.0496 22.4737 10.8727 21.8409 10.696 21.2081C9.96019 18.0775 9.96019 18.0775 8.104 15.5464C8.07425 15.5222 8.0445 15.4979 8.01385 15.4729C6.79767 14.4989 5.19556 14.1382 3.7284 13.7155C3.36553 13.6109 3.0028 13.5058 2.64009 13.4007C2.60837 13.3915 2.60837 13.3915 2.57601 13.3821C2.05283 13.2304 1.5298 13.0783 1.0086 12.9199C0.986549 12.9132 0.9645 12.9066 0.941783 12.8997C0.141064 12.6578 0.141064 12.6578 0.0017241 12.4884C-0.0022167 12.4115 -0.0022167 12.4115 0.0332505 12.3307C0.178889 12.188 0.320205 12.1269 0.512426 12.0647C0.540259 12.0554 0.56809 12.046 0.596766 12.0364C0.682008 12.0079 0.767436 11.9801 0.852936 11.9524C0.877335 11.9444 0.901735 11.9364 0.926874 11.9282C1.09943 11.8716 1.2726 11.8171 1.44603 11.7633C1.48864 11.75 1.48864 11.75 1.53212 11.7364C2.27272 11.5061 3.01815 11.2917 3.76336 11.0769C4.31866 10.9168 4.87302 10.754 5.42561 10.5847C5.451 10.577 5.4764 10.5692 5.50256 10.5613C6.78267 10.1705 8.03409 9.61612 8.86063 8.51606C8.873 8.49974 8.88538 8.48342 8.89813 8.46661C9.8186 7.24564 10.1775 5.76082 10.5785 4.31201C10.7105 3.83552 10.844 3.35947 10.9779 2.88356C11.015 2.75177 11.0521 2.61997 11.089 2.48812C11.2372 1.95852 11.3876 1.42964 11.5467 0.903181C11.5616 0.853882 11.5764 0.804561 11.5911 0.755218C11.8138 0.0111205 11.8138 0.0111205 12.0251 0Z\" fill=\"#3F43EE\"/>\n <path d=\"M19.2962 1.54899C19.441 1.7128 19.4699 1.90532 19.515 2.11449C19.6653 2.77161 19.8384 3.37584 20.4394 3.75756C20.8102 3.96263 21.2522 4.05595 21.663 4.14409C21.8364 4.18205 21.9829 4.23242 22.1316 4.33316C22.1651 4.38636 22.1651 4.38636 22.1632 4.47897C22.1287 4.59159 22.0984 4.62791 22.0075 4.70163C21.9081 4.73488 21.9081 4.73488 21.7888 4.76074C21.7437 4.7711 21.6985 4.78158 21.6535 4.79214C21.6293 4.79774 21.6051 4.80335 21.5803 4.80912C20.8456 4.97907 20.8456 4.97907 20.2105 5.36368C20.1899 5.3803 20.1692 5.39692 20.1479 5.41405C19.6941 5.81426 19.5981 6.48 19.4615 7.0377C19.4536 7.06833 19.4458 7.09896 19.4377 7.13051C19.431 7.15762 19.4242 7.18474 19.4172 7.21267C19.3877 7.29546 19.3572 7.34945 19.2962 7.41289C19.1266 7.43444 19.1266 7.43444 19.044 7.41289C18.9128 7.31114 18.8834 7.19524 18.8491 7.0395C18.8433 7.01539 18.8376 6.99127 18.8317 6.96642C18.8134 6.8894 18.7956 6.81226 18.778 6.73508C18.6398 6.13403 18.4837 5.54432 17.9324 5.19201C17.5015 4.95172 16.9776 4.83808 16.496 4.74631C16.364 4.71883 16.2884 4.68427 16.2067 4.57552C16.1889 4.46518 16.1889 4.46518 16.2067 4.35484C16.3322 4.22484 16.4644 4.19311 16.6342 4.15386C16.6877 4.14061 16.7412 4.12726 16.7947 4.11383C16.8223 4.10694 16.85 4.10004 16.8784 4.09294C17.0193 4.05668 17.1588 4.01602 17.2983 3.97455C17.3236 3.9672 17.3489 3.95985 17.3751 3.95227C17.6585 3.86752 17.9032 3.75911 18.1298 3.56668C18.1509 3.54928 18.172 3.53189 18.1938 3.51397C18.5465 3.19658 18.6663 2.71976 18.7751 2.27484C18.7834 2.24106 18.7916 2.20728 18.8002 2.17248C18.8167 2.10463 18.8329 2.0367 18.8488 1.9687C18.8602 1.92139 18.8602 1.92139 18.8717 1.87312C18.8784 1.84486 18.885 1.81659 18.8918 1.78747C18.9209 1.69749 18.959 1.62683 19.0125 1.54899C19.1153 1.49761 19.1874 1.52084 19.2962 1.54899Z\" fill=\"#0F12A8\"/>\n <path d=\"M4.7881 17.4219C4.82561 17.4222 4.82561 17.4222 4.86387 17.4225C5.13296 17.4307 5.31503 17.5169 5.51321 17.6978C5.74381 17.9469 5.85029 18.2279 5.84423 18.5637C5.81833 18.8359 5.65779 19.0736 5.46087 19.2576C5.22908 19.4447 4.99525 19.5065 4.69906 19.4979C4.44933 19.4688 4.21438 19.3502 4.03738 19.1717C3.81726 18.8713 3.75291 18.5958 3.78517 18.2259C3.8518 17.9346 4.0439 17.6981 4.28959 17.5323C4.46027 17.4458 4.59755 17.4203 4.7881 17.4219Z\" fill=\"#1216CC\"/>\n </svg>\n </div>\n <svg class=\"cqa-absolute\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px;\">\n <circle cx=\"30\" cy=\"30\" r=\"28\" stroke=\"#E2E2E3\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n <svg class=\"cqa-absolute cqa-ff-spin\"\n width=\"60\" height=\"60\" viewBox=\"0 0 60 60\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\n style=\"top: -2px; left: -2px; transform-origin: 30px 30px;\">\n <path d=\"M30 2 A 28 28 0 0 1 54.24 44\"\n stroke=\"#3f43ee\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>\n </div>\n </div>\n\n <p class=\"cqa-text-center cqa-m-0 cqa-mb-2\"\n style=\"font-size: 16px; font-weight: 600; color: #161617;\">\n Fast-forwarding to your step\n </p>\n\n <p class=\"cqa-text-center cqa-m-0\"\n style=\"font-size: 12px; color: #6D6D74;\">\n Steps {{ fastForwardConfig.fromStep }}\u2013{{ fastForwardConfig.toStep }} are running at full speed in the background.\n <strong style=\"color: #6D6D74; font-weight: 600;\">Live view and screenshots are paused</strong>\n until execution reaches your target step \u2014 then you're in automatically.\n </p>\n\n <div class=\"cqa-mt-6 cqa-mb-5\">\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-mb-2\">\n <span style=\"font-size: 12px; color: #4C4C51;\">Steps executing in background</span>\n <span style=\"font-size: 12px; color: #6D6D74;\">\n {{ fastForwardConfig.currentStep }} of {{ fastForwardConfig.totalSteps }} steps\n </span>\n </div>\n <div style=\"height: 6px; background-color: #E2E2E3; border-radius: 9999px; overflow: hidden;\">\n <div [style.width.%]=\"fastForwardProgressPercent\"\n style=\"height: 100%; background: linear-gradient(90deg, #3F43EE 0%, #818CF8 100%); transition: width 300ms cubic-bezier(0.4,0,0.2,1);\"></div>\n </div>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\"\n style=\"padding: 10px 14px; border-radius: 10px; background: #6366F11A; border: 1px solid #6366F133;\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" style=\"flex-shrink: 0;\">\n <circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"#3f43ee\" stroke-width=\"1.25\"/>\n <circle cx=\"8\" cy=\"8\" r=\"1\" fill=\"#3f43ee\"/>\n </svg>\n <div style=\"font-size: 12px;\">\n <span style=\"color: #6D6D74;\">Jumping to</span>\n <span style=\"color: #3F43EE; font-weight: 400; display: block;\">\n Step {{ fastForwardConfig.targetStepNumber }} \u2014 <span [innerHTML]=\"fastForwardConfig.targetStepLabel\"></span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Live Content View -->\n <div *ngIf=\"!isFastForwarding && isLive && liveSessionView === 'live'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center cqa-relative\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-overflow-hidden\"\n [ngClass]=\"{\n 'cqa-w-auto': hasDeviceFrame,\n 'cqa-w-full cqa-flex-col': !hasDeviceFrame,\n 'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser',\n 'cqa-max-h-full cqa-h-full': hasDeviceFrame && (effectivePlatformType !== 'browser' || !isLive),\n 'cqa-min-w-max': hasDeviceFrame && effectivePlatformType === 'device'\n }\"\n [ngStyle]=\"liveContentContainerStyle\">\n <img *ngIf=\"hasDeviceFrame\"\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div [ngClass]=\"{\n 'cqa-absolute cqa-flex cqa-flex-col': hasDeviceFrame,\n 'cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative': !hasDeviceFrame,\n 'cqa-z-20': hasDeviceFrame && effectivePlatformType === 'browser',\n 'cqa-bg-white': hasDeviceFrame && effectivePlatformType !== 'browser'\n }\"\n [ngStyle]=\"hasDeviceFrame ? deviceScreenStyle : {}\">\n <!-- Loading State -->\n <div *ngIf=\"isContentVideoLoading\" class=\"cqa-p-10 cqa-text-center cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center\">\n <div class=\"cqa-mb-4\">\n <mat-progress-spinner mode=\"indeterminate\" diameter=\"40\"></mat-progress-spinner>\n </div>\n <p class=\"cqa-text-gray-400 cqa-text-sm\">{{ liveLoadingLabel }}</p>\n </div>\n\n <!-- Live Content (when not loading) -->\n <div *ngIf=\"!isContentVideoLoading\" class=\"cqa-w-full cqa-h-full cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-relative\">\n <div *ngIf=\"liveStatus === 'Failed' && failedStatusMessage\" class=\"cqa-p-6 cqa-text-center cqa-w-full\">\n <div class=\"cqa-inline-flex cqa-items-center cqa-gap-2 cqa-px-4 cqa-py-3 cqa-bg-[#FCD9D9] cqa-border cqa-border-[#F9BFBF] cqa-rounded-lg\">\n <mat-icon style=\"width: 18px; height: 18px; color: #C63535; font-size: 18px;\">error</mat-icon>\n <p class=\"cqa-text-[#C63535] cqa-text-sm cqa-font-medium cqa-m-0\">{{ failedStatusMessage }}</p>\n </div>\n </div>\n <ng-content *ngIf=\"liveStatus !== 'Failed' || !failedStatusMessage\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Video View: post-execution Video tab, or mid-session Captured view inside a live session -->\n <div *ngIf=\"!isFastForwarding && ((!isLive && currentView === 'video') || (isLive && liveSessionView === 'captured'))\"\n class=\"cqa-h-full cqa-flex cqa-flex-col\"\n tabindex=\"0\"\n role=\"region\"\n aria-label=\"Video playback\"\n (keydown)=\"onVideoKeydown($event)\">\n <div class=\"cqa-w-full cqa-flex cqa-items-center\" *ngIf=\"currentVideoUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device', 'cqa-mt-auto': hasDeviceFrame, 'cqa-max-h-[calc(100%-108px)]': showVideoLibrary, 'cqa-max-h-[calc(100%-60px)]': !showVideoLibrary}\">\n <ng-container *ngIf=\"hasDeviceFrame; else videoNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-max-h-full cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-object-cover cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2] cqa-cursor-pointer\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n (click)=\"onVideoFrameClick()\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngClass]=\"{'cqa-z-30': effectivePlatformType === 'browser'}\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #videoNoFrame>\n <div class=\"cqa-relative cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-cursor-pointer\"\n (click)=\"onVideoFrameClick()\">\n <video\n *ngIf=\"!videoRefreshing\"\n #vplayer\n class=\"cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n [src]=\"currentVideoUrl\"\n type=\"video/webm\"\n (loadedmetadata)=\"onVideoMetadataLoaded()\"\n (canplay)=\"onVideoCanPlay()\"\n (ended)=\"onVideoEnded()\"\n (error)=\"onVideoError()\"\n ></video>\n <!-- Play/Pause overlay icon -->\n <div *ngIf=\"showPlayPauseOverlay\"\n class=\"cqa-absolute cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none\"\n [ngStyle]=\"{animation: 'cqaFadeOut 500ms ease-out forwards'}\">\n <div class=\"cqa-rounded-full cqa-bg-black cqa-bg-opacity-50 cqa-flex cqa-items-center cqa-justify-center\"\n style=\"width: 56px; height: 56px;\">\n <svg *ngIf=\"isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5,3 19,12 5,21\" />\n </svg>\n <svg *ngIf=\"!isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"white\">\n <rect x=\"5\" y=\"3\" width=\"4\" height=\"18\" />\n <rect x=\"15\" y=\"3\" width=\"4\" height=\"18\" />\n </svg>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!currentVideoUrl\">\n <ng-container *ngIf=\"isVNCSessionIntruppted && vncSessionIntupptedMessage; else noVideoDefault\">\n <p class=\"cqa-text-sm cqa-text-gray-600\">\n {{ vncSessionIntupptedMessage }}\n </p>\n </ng-container>\n <ng-template #noVideoDefault>\n <span>No video recording found</span>\n </ng-template>\n </div>\n \n <!-- Video Library Panel \u2014 reserves only header-height in flow; the inner panel is absolutely anchored to its bottom edge, so the body expanding makes the panel grow UPWARD over the video. Timeline stays put. -->\n <div *ngIf=\"showVideoLibrary && videoUrls && videoUrls.length > 0\"\n class=\"video-library\"\n [class.video-library--open]=\"!isVideoLibraryCollapsed\"\n [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame}\">\n <div class=\"video-library__inner\">\n <!-- Header \u2014 always visible, clicking the chevron toggles the body -->\n <div class=\"video-library__header\">\n <div class=\"video-library__title-group\">\n <mat-icon class=\"video-library__icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M9.33398 7.58308L12.3807 9.61425C12.4247 9.64348 12.4757 9.66024 12.5284 9.66276C12.5811 9.66528 12.6335 9.65347 12.68 9.62856C12.7265 9.60366 12.7654 9.56661 12.7925 9.52136C12.8196 9.4761 12.834 9.42434 12.834 9.37158V4.59058C12.834 4.53926 12.8205 4.48885 12.7948 4.44443C12.7691 4.40001 12.7321 4.36315 12.6876 4.33759C12.6431 4.31203 12.5926 4.29866 12.5413 4.29883C12.49 4.299 12.4396 4.31272 12.3953 4.33858L9.33398 6.12475\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.16602 3.5H2.33268C1.68835 3.5 1.16602 4.02233 1.16602 4.66667V9.33333C1.16602 9.97767 1.68835 10.5 2.33268 10.5H8.16602C8.81035 10.5 9.33268 9.97767 9.33268 9.33333V4.66667C9.33268 4.02233 8.81035 3.5 8.16602 3.5Z\" stroke=\"#3F43EE\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </mat-icon>\n <span class=\"video-library__title\">Video Library</span>\n <cqa-badge\n size=\"small\"\n inlineStyles=\"min-width: max-content;\"\n backgroundColor=\"#EDE9FE\"\n textColor=\"#6D28D9\"\n [label]=\"videoUrls.length + ' clip' + (videoUrls.length === 1 ? '' : 's')\">\n </cqa-badge>\n <span class=\"video-library__subtitle\"\n [matTooltip]=\"isVideoFullMode ? 'Playing all clips as one continuous video' : 'Each clip covers execution since last capture'\"\n matTooltipPosition=\"below\">{{ isVideoFullMode ? '\u00B7 Playing all clips as one continuous video' : '\u00B7 Each clip covers execution since last capture' }}</span>\n </div>\n <div class=\"video-library__actions\">\n <cqa-button\n *ngIf=\"!isVideoFullMode\"\n variant=\"filled\"\n btnSize=\"md\"\n icon=\"play_arrow\"\n iconPosition=\"start\"\n text=\"Show Full Video\"\n (clicked)=\"onShowFullVideo()\">\n </cqa-button>\n <cqa-button\n *ngIf=\"isVideoFullMode\"\n variant=\"outlined\"\n btnSize=\"md\"\n icon=\"close\"\n iconPosition=\"start\"\n text=\"Exit Full Video\"\n (clicked)=\"onExitFullVideo()\">\n </cqa-button>\n <button type=\"button\" class=\"video-library__collapse\" (click)=\"toggleVideoLibraryCollapsed()\"\n [attr.aria-label]=\"isVideoLibraryCollapsed ? 'Show video library' : 'Hide video library'\">\n <svg *ngIf=\"!isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 7.5L6 4.5L9 7.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"isVideoLibraryCollapsed\" xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"#6B7280\" stroke-width=\"1.25\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Body (cards) \u2014 max-height animates from 0 (collapsed) to a fixed height (open). -->\n <div class=\"video-library__body\"\n [class.video-library__body--open]=\"!isVideoLibraryCollapsed\"\n [attr.aria-hidden]=\"isVideoLibraryCollapsed ? true : null\">\n <div class=\"clips-row\"\n #clipsScroller\n [class.clips-row--dragging]=\"clipsDragActive\"\n (mousedown)=\"onClipsMouseDown($event, clipsScroller)\"\n (mousemove)=\"onClipsMouseMove($event, clipsScroller)\"\n (mouseup)=\"onClipsMouseUp($event)\"\n (mouseleave)=\"onClipsMouseLeave($event)\">\n <div\n *ngFor=\"let url of videoUrls; let i = index; trackBy: trackLibraryClipByIndex\"\n class=\"clip-card\"\n [class.clip-card--playing]=\"i === currentVideoIndex\">\n <div class=\"clip-thumb\"\n [class.clip-thumb--ready]=\"libraryVideoDurations.has(i)\"\n (click)=\"selectLibraryClip(i)\">\n <video\n #clipVideo\n class=\"clip-thumb__video\"\n [src]=\"url\"\n preload=\"metadata\"\n playsinline\n muted\n (loadedmetadata)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"\n (durationchange)=\"onLibraryClipMetadataLoaded(i, clipVideo)\"></video>\n <div class=\"clip-thumb__overlay\">\n <div class=\"clip-thumb__play-circle\">\n <svg *ngIf=\"!(i === currentVideoIndex && isPlaying)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M3.5 1.75L11.375 7L3.5 12.25V1.75Z\" fill=\"#FFFFFF\"/>\n </svg>\n <svg *ngIf=\"i === currentVideoIndex && isPlaying\" xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect x=\"3.5\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n <rect x=\"8\" y=\"2.5\" width=\"2.5\" height=\"9\" rx=\"0.5\" fill=\"#FFFFFF\"/>\n </svg>\n </div>\n </div>\n <span *ngIf=\"i === currentVideoIndex && isPlaying\" class=\"clip-thumb__badge clip-thumb__badge--playing\">PLAYING</span>\n <span *ngIf=\"newVideoIndexes.has(i) && i !== currentVideoIndex\" class=\"clip-thumb__badge clip-thumb__badge--new\">NEW</span>\n <span class=\"clip-thumb__duration\">{{ formatTime(libraryVideoDurations.get(i) || 0) }}</span>\n </div>\n <div class=\"clip-meta\">\n <div class=\"clip-meta__title\">Clip {{ i + 1 }}</div>\n <button\n type=\"button\"\n class=\"clip-download-btn\"\n [class.clip-download-btn--downloading]=\"downloadingIndexes.has(i)\"\n [disabled]=\"downloadingIndexes.has(i)\"\n (click)=\"downloadClip(i); $event.stopPropagation()\">\n <ng-container *ngIf=\"!downloadingIndexes.has(i)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <!-- Figma icon: upward arrow with a short tray line at the bottom (share/export glyph). -->\n <path d=\"M6 8.5V2M6 2L3 5M6 2L9 5M3 10.5H9\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Download</span>\n </ng-container>\n <ng-container *ngIf=\"downloadingIndexes.has(i)\">\n <svg class=\"clip-download-btn__ring\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#E5E7EB\" stroke-width=\"1.5\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"\n stroke-linecap=\"round\"\n [attr.stroke-dasharray]=\"downloadRingCircumference\"\n [attr.stroke-dashoffset]=\"downloadRingDashoffset(i)\"\n transform=\"rotate(-90 7 7)\"/>\n </svg>\n <span>{{ downloadProgress.get(i) || 0 }}%</span>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cqa-px-2 cqa-py-2 cqa-bg-white\" style=\"border-top: 1px solid #E5E7EB;\" [ngClass]=\"{'cqa-mt-auto': hasDeviceFrame && !(showVideoLibrary && videoUrls && videoUrls.length > 0)}\" *ngIf=\"currentVideoUrl && (!isLive || liveSessionView === 'captured')\">\n <span *ngIf=\"!isVideoFullMode\"\n class=\"cqa-text-[#6B7280] cqa-text-[12px] cqa-font-medium cqa-mb-2 cqa-whitespace-nowrap cqa-block\">\n Video {{ currentVideoIndex + 1 }} playing out of {{ videoUrls?.length || 0 }}\n </span>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"currentVideoIndex === 0\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\"\n (click)=\"prevVideo()\"\n matTooltip=\"Previous video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': currentVideoIndex === 0}\">skip_previous</mat-icon>\n </button>\n\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\" style=\"width: 16px; height: 16px;\">\n <mat-progress-spinner\n *ngIf=\"isPlayerSwitching\"\n mode=\"indeterminate\"\n diameter=\"16\"\n class=\"cqa-inline-block\">\n </mat-progress-spinner>\n <button \n *ngIf=\"!isPlayerSwitching\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n (click)=\"togglePlay()\"\n matTooltip=\"{{ isPlaying ? 'Pause' : 'Play' }}\"\n matTooltipPosition=\"above\">\n <span *ngIf=\"!isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3 2L13 8L3 14V2Z\" fill=\"#374151\"/>\n </svg>\n </span>\n <span *ngIf=\"isPlaying\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n <rect x=\"10\" y=\"2\" width=\"3\" height=\"12\" fill=\"#374151\"/>\n </svg>\n </span>\n </button>\n </div>\n\n <button\n *ngIf=\"hasMultipleVideos && !isVideoFullMode\"\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer !cqa-px-0 cqa-flex cqa-items-center cqa-justify-center hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none\"\n style=\"pointer-events: auto;\"\n [disabled]=\"videoUrls && (currentVideoIndex >= videoUrls.length - 1)\"\n [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\"\n (click)=\"nextVideo()\"\n matTooltip=\"Next video\"\n matTooltipPosition=\"above\">\n <mat-icon class=\"cqa-w-4 cqa-h-4 !cqa-text-[16px] cqa-text-[#374151]\" [ngClass]=\"{'cqa-opacity-50 cqa-cursor-not-allowed': videoUrls && (currentVideoIndex >= videoUrls.length - 1)}\">skip_next</mat-icon>\n </button>\n\n <span\n class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-inline-block\"\n style=\"width: 40px; text-align: center;\">\n {{ formatTime(isVideoFullMode ? (globalCurrentTimeMs / 1000) : (vplayer?.nativeElement?.currentTime || 0)) }}\n </span>\n\n <div #speedControlContainer class=\"cqa-relative cqa-mr-[8px] cqa-flex cqa-items-center cqa-justify-center\">\n <button\n type=\"button\"\n class=\"cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-text-[#9CA3AF] cqa-text-[10px] cqa-leading-[15px] cqa-font-medium cqa-whitespace-nowrap cqa-select-none hover:cqa-opacity-70 cqa-transition-opacity cqa-outline-none cqa-px-1\"\n (click)=\"toggleSpeedControl()\"\n [matTooltip]=\"'Playback Speed'\"\n [matTooltipPosition]=\"'below'\">\n {{ currentSpeed }}\n </button>\n \n <div \n *ngIf=\"isSpeedControlOpen\"\n class=\"cqa-absolute cqa-bottom-full cqa-mb-2 cqa-right-0 cqa-bg-[#F0F0F1] cqa-rounded-lg cqa-overflow-hidden cqa-shadow-lg cqa-z-50\"\n style=\"min-width: max-content; left: 50%; bottom: 0%; transform: translate(-50%, -50%); z-index: 101;\">\n <cqa-segment-control\n [segments]=\"speedSegments\"\n [value]=\"currentSpeed\"\n [containerBgColor]=\"'#F0F0F1'\"\n (valueChange)=\"onSpeedChange($event)\">\n </cqa-segment-control>\n </div>\n </div>\n \n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <div \n #timelineBar\n class=\"cqa-relative cqa-h-1 cqa-bg-gray-200 cqa-rounded-full cqa-cursor-pointer cqa-w-full\"\n (click)=\"onTimelineClick($event)\">\n \n <div\n *ngFor=\"let marker of (isVideoFullMode ? fullVideoMarkers : currentVideoMarkers)\"\n class=\"cqa-absolute cqa-rounded-full\"\n [style.left.%]=\"isVideoFullMode ? getGlobalFullStepLeftPosition(marker) : getStepLeftPosition(marker)\"\n [style.width]=\"'8px'\"\n [style.height]=\"'8px'\"\n [style.background]=\"getGlobalMarkerColor(marker.level)\"\n [style.border]=\"'2px solid ' + getGlobalMarkerResultColor(marker.result)\"\n [style.box-sizing]=\"'border-box'\"\n [attr.title]=\"marker.title || ''\"\n style=\"pointer-events: auto; z-index: 50; cursor: pointer; transform: translate(-50%, -50%); top: 50%;\"\n (click)=\"onMarkerClick($event, marker)\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-left-0 cqa-top-0 cqa-h-full cqa-bg-blue-500 cqa-rounded-full\"\n [style.width.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n [style.transition]=\"dragging ? 'none' : 'width 100ms'\"\n style=\"pointer-events: none; z-index: 2;\">\n </div>\n \n <div\n class=\"cqa-absolute cqa-top-1/2 cqa-w-3 cqa-h-3 cqa-bg-blue-600 cqa-rounded-full cqa-cursor-grab active:cqa-cursor-grabbing cqa-shadow-md\"\n [style.left.%]=\"isVideoFullMode ? globalScrubberPercent : progress\"\n style=\"transform: translate(-50%, -50%); z-index: 60;\"\n (mousedown)=\"startDrag($event)\">\n </div>\n </div>\n </div>\n\n <span class=\"cqa-text-[#9CA3AF] cqa-text-[9px] cqa-font-normal cqa-whitespace-nowrap cqa-select-none cqa-mr-2\">\n {{ formatTime(isVideoFullMode ? (totalDuration / 1000) : (vplayer?.nativeElement?.duration || 0)) }}\n </span>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'screenshots'\" class=\"cqa-h-full\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center\" *ngIf=\"screenShotUrl\">\n <ng-container *ngIf=\"hasDeviceFrame; else screenshotNoFrame\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <div class=\"cqa-relative cqa-h-full cqa-w-auto cqa-flex cqa-items-center cqa-justify-center cqa-max-h-full\" [ngClass]=\"{'cqa-rounded-md cqa-overflow-hidden': effectivePlatformType === 'browser', 'cqa-min-w-max': effectivePlatformType === 'device'}\">\n <img\n [src]=\"deviceMockupImage\"\n alt=\"Device mockup\"\n class=\"cqa-h-full cqa-w-auto cqa-object-contain cqa-block cqa-pointer-events-none cqa-z-10\"\n [ngClass]=\"{'cqa-max-h-[inherit]': effectivePlatformType === 'browser', 'cqa-max-h-full': effectivePlatformType !== 'browser'}\"\n />\n <div class=\"cqa-absolute cqa-flex cqa-flex-col\" [ngStyle]=\"deviceScreenStyle\" [ngClass]=\"{'cqa-bg-white': effectivePlatformType !== 'browser'}\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n [ngClass]=\"{'cqa-z-20': effectivePlatformType === 'browser'}\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #screenshotNoFrame>\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-p-4\">\n <img\n [src]=\"screenShotUrl\"\n alt=\"Screenshot\"\n class=\"cqa-object-contain cqa-w-full cqa-h-full cqa-block cqa-bg-[##F2F2F2]\"\n />\n </div>\n </ng-template>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!screenShotUrl\">\n No screenshot available\n </div>\n </div>\n\n <div *ngIf=\"!isFastForwarding && !isLive && currentView === 'trace'\" class=\"cqa-h-full cqa-flex cqa-flex-col cqa-justify-center\">\n <div class=\"cqa-w-full cqa-h-full cqa-flex cqa-items-center cqa-relative\" *ngIf=\"traceViewUrl\" [ngClass]=\"{'!cqa-h-full': effectivePlatformType === 'device'}\" style=\"padding-top: 48px; padding-bottom: 0px;\">\n <div class=\"cqa-w-full cqa-h-full cqa-overflow-hidden cqa-relative\">\n <iframe \n [src]=\"safeTraceUrl\" \n title=\"Trace Viewer\"\n class=\"cqa-object-contain cqa-w-full cqa-min-h-[250px] cqa-max-h-full cqa-block cqa-bg-[##F2F2F2]\"\n style=\"margin-top: -48px; height: calc(100% + 48px);\"\n frameborder=\"0\"\n allowfullscreen\n width=\"100%\"\n loading=\"lazy\"\n (load)=\"onTraceViewerLoad()\"\n (error)=\"onTraceViewerError()\">\n </iframe>\n </div>\n \n <div *ngIf=\"traceViewerLoading\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Loading trace viewer...\n </div>\n </div>\n \n <div *ngIf=\"traceViewerError\" class=\"cqa-absolute cqa-inset-0 cqa-bg-[#F3F4F6] cqa-flex cqa-items-center cqa-justify-center cqa-z-10\">\n <div class=\"cqa-text-center cqa-text-gray-400 cqa-text-sm\">\n Failed to load trace viewer\n </div>\n </div>\n </div>\n \n <div class=\"cqa-p-10 cqa-text-center cqa-text-gray-400 cqa-text-sm cqa-h-full cqa-flex cqa-items-center cqa-justify-center\" *ngIf=\"!traceViewUrl\">\n No trace available\n </div>\n </div> \n </div>\n</div>", styles: [] }]
|
|
2387
2387
|
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { videoUrl: [{
|
|
2388
2388
|
type: Input
|
|
2389
2389
|
}], videoUrls: [{
|
|
@@ -2471,4 +2471,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
2471
2471
|
type: HostListener,
|
|
2472
2472
|
args: ['window:resize']
|
|
2473
2473
|
}] } });
|
|
2474
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBd2U3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4ZXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdB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YztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZhc3RGb3J3YXJkQ29uZmlnIHtcbiAgZnJvbVN0ZXA6IG51bWJlcjtcbiAgdG9TdGVwOiBudW1iZXI7XG4gIGN1cnJlbnRTdGVwOiBudW1iZXI7XG4gIHRvdGFsU3RlcHM6IG51bWJlcjtcbiAgdGFyZ2V0U3RlcE51bWJlcjogc3RyaW5nO1xuICB0YXJnZXRTdGVwTGFiZWw6IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBicm93c2VyRGV2aWNlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSBpc0Zhc3RGb3J3YXJkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhc3RGb3J3YXJkQ29uZmlnOiBGYXN0Rm9yd2FyZENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHNob3dWaWRlb0xpYnJhcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NhcHR1cmVWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0NhcHR1cmluZ1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gV2hlbiBgaXNMaXZlYCBhbmQgYXQgbGVhc3Qgb25lIGNsaXAgaXMgcHJlc2VudCBpbiBgdmlkZW9VcmxzYCwgdGhlIHNpbXVsYXRvclxuICAvLyBoZWFkZXIgc2hvd3MgYSBMaXZlL0NhcHR1cmVkIHNlZ21lbnQgY29udHJvbC4gUGFyZW50IGNhbiBhbHNvIGRyaXZlIHRoZSB2aWV3XG4gIC8vIGltcGVyYXRpdmVseSAoZS5nLiBcIldhdGNoIE5vd1wiIGJ1dHRvbiBpbiB0aGUgY2FwdHVyZSBkaWFsb2cpIGJ5IHB1c2hpbmcgYVxuICAvLyBuZXcgdmFsdWUgdGhyb3VnaCB0aGlzIGlucHV0LlxuICBASW5wdXQoKSBsaXZlU2Vzc2lvblZpZXc6ICdsaXZlJyB8ICdjYXB0dXJlZCcgPSAnbGl2ZSc7XG5cbiAgZ2V0IGZhc3RGb3J3YXJkUHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgYyA9IHRoaXMuZmFzdEZvcndhcmRDb25maWc7XG4gICAgaWYgKCFjIHx8ICFjLnRvdGFsU3RlcHMpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIChjLmN1cnJlbnRTdGVwIC8gYy50b3RhbFN0ZXBzKSAqIDEwMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlkZW9UaW1lVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWFya2VySGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdGVwTWFya2VyPigpO1xuICBAT3V0cHV0KCkgaXNWaWRlb1BsYXlpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjYXB0dXJlVmlkZW9SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsaXZlU2Vzc2lvblZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdsaXZlJyB8ICdjYXB0dXJlZCc+KCk7XG5cbiAgcHJpdmF0ZSBfdnBsYXllcj86IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndnBsYXllcicpXG4gIHNldCB2cGxheWVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSB7XG4gICAgICAvLyBFbGVtZW50IGlzIGJlaW5nIHVubW91bnRlZCAoZS5nLiB1c2VyIHRvZ2dsZWQgZnJvbSBDYXB0dXJlZCDihpIgTGl2ZSBkdXJpbmcgYVxuICAgICAgLy8gbWlkLWZsaWdodCBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCkuIERyb3AgdGhlIHN0YWxlIHJlZmVyZW5jZSBzbyBhbnlcbiAgICAgIC8vIGZvbGxvdy11cCBhdHRlbXB0IHRvIG9wZXJhdGUgb24gLm5hdGl2ZUVsZW1lbnQgc2hvcnQtY2lyY3VpdHMgb3V0IGNsZWFubHkuXG4gICAgICB0aGlzLl92cGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1BsYXlQYXVzZU92ZXJsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIC8vIFZpZGVvLW9uLWRlbWFuZCAoVmlkZW8gTGlicmFyeSkgc3RhdGUg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaXMgYHZpZGVvVXJsc2AuXG4gIC8vIGBuZXdWaWRlb0luZGV4ZXNgIG1hcmtzIHdoaWNoIGluZGV4ZXMgd2VyZSBqdXN0IGNhcHR1cmVkIChzbyB3ZSBjYW4gc2hvdyB0aGVcbiAgLy8gTkVXIGJhZGdlIHVudGlsIHRoYXQgY2xpcCBpcyBzZWxlY3RlZCk7IGBsaWJyYXJ5VmlkZW9EdXJhdGlvbnNgIGNhY2hlcyB0aGVcbiAgLy8gbWV0YWRhdGEtbG9hZGVkIGR1cmF0aW9uIHBlciBpbmRleCBmb3IgZWFjaCBsaWJyYXJ5IGNhcmQncyB0aHVtYm5haWwuXG4gIGlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgbmV3VmlkZW9JbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsaWJyYXJ5VmlkZW9EdXJhdGlvbnM6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBkb3dubG9hZGluZ0luZGV4ZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGRvd25sb2FkUHJvZ3Jlc3M6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyAwLTEwMCBwZXIgY2xpcCBpbmRleFxuICBAVmlld0NoaWxkcmVuKCdjbGlwVmlkZW8nKSBjbGlwVmlkZW9zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdjbGlwc1Njcm9sbGVyJykgY2xpcHNTY3JvbGxlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhc3RMaWJyYXJ5U3luY0tleTogc3RyaW5nID0gJyc7XG4gIC8vIFRyYWNrcyB3aGljaCBjbGlwIGluZGV4IHRoZSBsaWJyYXJ5IHJvdyB3YXMgbGFzdCBhdXRvLXNjcm9sbGVkIHRvLCBzbyB0aGVcbiAgLy8gdGltZXVwZGF0ZSBoYW5kbGVyIGRvZXNuJ3QgcmUtdHJpZ2dlciBhIHNjcm9sbCBldmVyeSBmcmFtZS5cbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsZWRDbGlwSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIEF1dG8tcmVjb3Zlcnk6IHdoZW4gdGhlIDx2aWRlbz4gZmlyZXMgYW4gZXJyb3IgZXZlbnQgKGUuZy4gQ2hyb21lJ3NcbiAgLy8gXCJQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyXCIgYWZ0ZXIgYSBuZXR3b3JrIGdsaXRjaCksIHdlIGZsaXBcbiAgLy8gdGhpcyBmbGFnIHRvIHVubW91bnQgdGhlIDx2aWRlbz4gdmlhICpuZ0lmLCB0aGVuIGZsaXAgaXQgYmFjayBzbyBBbmd1bGFyXG4gIC8vIHJlbW91bnRzIGEgZnJlc2ggZWxlbWVudCDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlXG4gIC8vIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kIHJlY292ZXIgcGxheWJhY2sgdG9kYXkuXG4gIHZpZGVvUmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVNlZWtTZWM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVBsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRUNPVkVSWV9BVFRFTVBUUyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFJFQ09WRVJZX1dJTkRPV19NUyA9IDEwXzAwMDtcblxuICAvLyBQaGFzZSAyIOKAlCBcIlNob3cgRnVsbCBWaWRlb1wiIG1vZGUuIFdoZW4gdHJ1ZSwgdGhlIG1haW4gdGltZWxpbmUgc3BhbnMgdGhlIHRvdGFsXG4gIC8vIGR1cmF0aW9uIGFjcm9zcyBhbGwgY2xpcHMgYW5kIHN0ZXAgbWFya2VycyBmcm9tIGV2ZXJ5IGNsaXAgYXJlIGxhaWQgb3V0IG9uIGl0LlxuICAvLyBDbGlwLXRvLWNsaXAgdHJhbnNpdGlvbnMgaGFwcGVuIHVuZGVyIHRoZSBob29kIHZpYSB0aGUgZXhpc3Rpbmcgb25WaWRlb0VuZGVkXG4gIC8vIGF1dG8tYWR2YW5jZSBwYXRoIOKAlCB0aGUgdXNlciBkb2Vzbid0IHNlZSBhIHJlc2V0LlxuICBpc1ZpZGVvRnVsbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmVseSBkcmFnZ2luZy5cbiAgLy8gTmVlZGVkIGJlY2F1c2UgYHByb2dyZXNzYCBpcyBwZXItY3VycmVudC1jbGlwIGFuZCB3b3VsZCBnaXZlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgZ2xvYmFsRHJhZ1Byb2dyZXNzOiBudW1iZXIgPSAwO1xuXG4gIC8vIERyYWctdG8tc2Nyb2xsIHN0YXRlIGZvciB0aGUgY2xpcHMgcm93IChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKS5cbiAgcHJpdmF0ZSBjbGlwc0RyYWdTdGF0ZSA9IHsgZHJhZ2dpbmc6IGZhbHNlLCBzdGFydFg6IDAsIHN0YXJ0U2Nyb2xsTGVmdDogMCwgZGlkTW92ZTogZmFsc2UgfTtcbiAgY2xpcHNEcmFnQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSgpOiAnYnJvd3NlcicgfCAnZGV2aWNlJyB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykgcmV0dXJuICdkZXZpY2UnO1xuICAgIGlmICh0aGlzLnJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCkpIHJldHVybiAnZGV2aWNlJztcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8vICBTSE9XIFBMQVkgUEFVU0UgT1ZFUkxBWVxuICBvblZpZGVvRnJhbWVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICB0aGlzLnNob3dQbGF5UGF1c2VPdmVybGF5ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcik7XG4gICAgdGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSBmYWxzZTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHBsYXlWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgZWxpbWluYXRlcyBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGxheVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBwbGF5aW5nIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwbGF5aW5nLCBza2lwcGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogc3RhcnRpbmcnLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIHZpZGVvIHRvIGJlIHJlYWR5IGlmIG5lZWRlZFxuICAgIGlmICh2aWRlby5yZWFkeVN0YXRlIDwgSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHdhaXRpbmcgZm9yIG1ldGFkYXRhJyk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8gbWV0YWRhdGEnKSk7XG4gICAgICAgIH07XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGhpdCBtYXJrZXJzIGlmIHN0YXJ0aW5nIGZyb20gYmVnaW5uaW5nXG4gICAgY29uc3QgY3VycmVudFRpbWVNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICBpZiAoY3VycmVudFRpbWVNcyA8IDEwMCkge1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHN0YXRlIHRvIGxvYWRpbmdcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBiZWZvcmUgcGxheWluZ1xuICAgICAgY29uc3QgY3VycmVudFZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjdXJyZW50VmlkZW8gfHwgY3VycmVudFZpZGVvICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgb3IgdW5hdmFpbGFibGUnKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBd2FpdCBwbGF5IHByb21pc2UgLSB0aGlzIGlzIGNyaXRpY2FsXG4gICAgICBhd2FpdCB2aWRlby5wbGF5KCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciBwbGF5IHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJQbGF5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlb0FmdGVyUGxheSB8fCB2aWRlb0FmdGVyUGxheSAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBwbGF5Jyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGxheSBzdWNjZWVkZWRcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGxheWluZyc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QbGF5LmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBwbGF5aW5nIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyB2LmN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgLy8gUGxheSBmYWlsZWRcbiAgICAgIC8vIENoZWNrIGlmIHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgICBjb25zdCB2aWRlb0FmdGVyRXJyb3IgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJFcnJvciB8fCB2aWRlb0FmdGVyRXJyb3IgIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBkdXJpbmcgZXJyb3InKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICBcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWJvcnRlZCAoZXhwZWN0ZWQgZHVyaW5nIHBhdXNlKScpO1xuICAgICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkLCByZXNldCB0byBwYXVzZWQgc3RhdGUgaW5zdGVhZCBvZiBlcnJvclxuICAgICAgICBpZiAodmlkZW9BZnRlckVycm9yICYmIHZpZGVvQWZ0ZXJFcnJvciA9PT0gdmlkZW8pIHtcbiAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGF1c2VWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wYXVzZVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGF1c2VWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIC8vIEFscmVhZHkgcGF1c2VkIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwYXVzZWQsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2luZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG5cbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2VkIHN1Y2Nlc3NmdWxseScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWUgbWVkaWEgb3BlcmF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqIFRoaXMgaXMgdGhlIENSSVRJQ0FMIGZpeCBmb3IgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqIEFsbCBtZWRpYSBvcGVyYXRpb25zIChwbGF5LCBwYXVzZSwgc2Vlaywgc3dpdGNoKSBnbyB0aHJvdWdoIHRoaXMgcXVldWVcbiAgICovXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gdGhpcy5vcGVyYXRpb25RdWV1ZVxuICAgICAgLnRoZW4oKCkgPT4gb3BlcmF0aW9uKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gTWVkaWEgb3BlcmF0aW9uIGZhaWxlZDonLCBlcnIpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGhhc011bHRpcGxlVmlkZW9zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqIEN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBbbXNdLiBzZWdtZW50Qm91bmRhcmllc1tpXSA9IHN1bSBvZiBkdXJhdGlvbnMgWzAuLmldICovXG4gIGdldCBzZWdtZW50Qm91bmRhcmllcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kYXJpZXM6IG51bWJlcltdID0gW107XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCBkIG9mIGR1cmF0aW9ucykge1xuICAgICAgc3VtICs9IGQ7XG4gICAgICBib3VuZGFyaWVzLnB1c2goc3VtKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKiogVG90YWwgZHVyYXRpb24gYWNyb3NzIGFsbCBzZWdtZW50cyBpbiBtcyAqL1xuICBnZXQgdG90YWxEdXJhdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMudmlkZW9EdXJhdGlvbnM7XG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiBkdXJhdGlvbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKiogVmlkZW8gZHVyYXRpb25zIGluIG1zIChkZXRlY3RlZCBvciBmcm9tIHNpbmdsZSB2aWRlbyBlbGVtZW50KS5cbiAgICpcbiAgICogIE1lcmdlcyB0d28gaW5kZXBlbmRlbnQgcHJvYmVzOiBgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc2AgKG9mZi1ET00gdGVtcCB2aWRlb3MpXG4gICAqICBhbmQgYGxpYnJhcnlWaWRlb0R1cmF0aW9uc2AgKHRoZSByZW5kZXJlZCBsaWJyYXJ5IHRodW1ibmFpbHMpLiBFaXRoZXIgY2FuXG4gICAqICByZXNvbHZlIGZpcnN0IGRlcGVuZGluZyBvbiBicm93c2VyIHF1aXJrcyB3aXRoIFdlYk0vSW5maW5pdHktZHVyYXRpb24gY2xpcHM7XG4gICAqICB3ZSB0YWtlIHRoZSBmaXJzdCBmaW5pdGUgdmFsdWUgcGVyIGluZGV4LiAqL1xuICBwcml2YXRlIGdldCB2aWRlb0R1cmF0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnZpZGVvVXJscyB8fCBbXTtcbiAgICAgIGlmICh1cmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgY29uc3QgbWVyZ2VkOiBudW1iZXJbXSA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGRldGVjdGVkKSAmJiBkZXRlY3RlZCA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBkZXRlY3RlZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tTGlicmFyeVMgPSB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5nZXQoaSk7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUxpYnJhcnlTID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShmcm9tTGlicmFyeVMpICYmIGZyb21MaWJyYXJ5UyA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBmcm9tTGlicmFyeVMgKiAxMDAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVua25vd24geWV0IOKAlCBsZWF2ZSB0aGUgc2xvdCBhcyBhIGhvbGUgc28gY2FsbGVycyBjYW4gZGV0ZWN0IHBhcnRpYWwgc3RhdGUuXG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodmlkZW8/LmR1cmF0aW9uICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFt2aWRlby5kdXJhdGlvbiAqIDEwMDBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIGxldCBtYXJrZXJzVG9Qcm9jZXNzOiBTdGVwTWFya2VyW107XG4gICAgXG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IGJvdW5kYXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4XTtcbiAgICAgICAgXG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzXG4gICAgICAgICAgLmZpbHRlcihtYXJrZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPj0gY3VycmVudEJvdW5kYXJ5LnN0YXJ0ICYmIFxuICAgICAgICAgICAgICAgICAgIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPCBjdXJyZW50Qm91bmRhcnkuZW5kO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChtYXJrZXIgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24oXG4gICAgICAgICAgICBtYXJrZXIsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuZW5kXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKG1hcmtlcnNUb1Byb2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obWFya2VyOiBTdGVwTWFya2VyLCBhZGp1c3RtZW50OiBudW1iZXIsIHZpZGVvU3RhcnQ6IG51bWJlciwgdmlkZW9FbmQ6IG51bWJlcik6IFN0ZXBNYXJrZXIge1xuICAgIGNvbnN0IGFkanVzdGVkTWFya2VyOiBTdGVwTWFya2VyID0ge1xuICAgICAgLi4ubWFya2VyLFxuICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgIH07XG4gICAgXG4gICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFkanVzdGVkTWFya2VyLmNoaWxkU3RlcHMgPSBtYXJrZXIuY2hpbGRTdGVwc1xuICAgICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBjb25zdCBhZGp1c3RlZENoaWxkOiBTdGVwTWFya2VyID0ge1xuICAgICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgICBjdW11bGF0aXZlRHVyYXRpb246IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjaGlsZC5jaGlsZFN0ZXBzICYmIGNoaWxkLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWRqdXN0ZWRDaGlsZC5jaGlsZFN0ZXBzID0gY2hpbGQuY2hpbGRTdGVwc1xuICAgICAgICAgICAgICAuZmlsdGVyKG5lc3RlZENoaWxkID0+IG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAgICAgICAubWFwKG5lc3RlZENoaWxkID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG5lc3RlZENoaWxkLCBhZGp1c3RtZW50LCB2aWRlb1N0YXJ0LCB2aWRlb0VuZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRDaGlsZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZGp1c3RlZE1hcmtlcjtcbiAgfVxuXG4gIGdldFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybiAwO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvIGR1cmF0aW9uTXMpICogMTAwO1xuICB9XG5cbiAgLyoqIEZ1bGwtdmlkZW8gbWFya2VyczogZXZlcnkgbWFya2VyLCBmbGF0dGVuZWQsIGxhaWQgb3V0IG9uIHRoZSBnbG9iYWwgdGltZWxpbmUuXG4gICAqIGBzdGVwTWFya2Vyc2AgaXMgYWxyZWFkeSBpbiBnbG9iYWwgY29vcmRpbmF0ZXMg4oCUIGBjdXJyZW50VmlkZW9NYXJrZXJzYCBkb2VzIHRoZVxuICAgKiBpbnZlcnNlIChmaWx0ZXJzICsgYWRqdXN0cyBwZXItY2xpcCk7IGhlcmUgd2UganVzdCBmbGF0dGVuIHRoZSBvcmlnaW5hbCBsaXN0LiAqL1xuICBnZXQgZnVsbFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMgfHwgW10pO1xuICB9XG5cbiAgZ2V0R2xvYmFsRnVsbFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBlbGFwc2VkIG1zIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUgKHByaW9yIGNsaXAgZHVyYXRpb25zICsgY3VycmVudCBsb2NhbCB0aW1lKS4gKi9cbiAgZ2V0IGdsb2JhbEN1cnJlbnRUaW1lTXMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBsb2NhbCA9ICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lID8/IDApICogMTAwMDtcbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5zZWdtZW50Qm91bmRhcmllcztcbiAgICBjb25zdCBwcmlvckVuZCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwID8gKGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApIDogMDtcbiAgICByZXR1cm4gcHJpb3JFbmQgKyBsb2NhbDtcbiAgfVxuXG4gIC8qKiAwLTEwMCBwb3NpdGlvbiBvbiB0aGUgZ2xvYmFsIHRpbWVsaW5lLCBkcml2ZW4gYnkgdGltZXVwZGF0ZS4gKi9cbiAgZ2V0IGdsb2JhbFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHRoaXMuZ2xvYmFsQ3VycmVudFRpbWVNcyAvIHRvdGFsKSAqIDEwMCkpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGRyYWdnaW5nIGluIGZ1bGwgbW9kZSwgdGhlIHNjcnViYmVyIHJlYWRzIHRoZSBvdmVycmlkZTsgb3RoZXJ3aXNlIGdsb2JhbFByb2dyZXNzLiAqL1xuICBnZXQgZ2xvYmFsU2NydWJiZXJQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmcgPyB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA6IHRoaXMuZ2xvYmFsUHJvZ3Jlc3M7XG4gIH1cblxuICBnZXRTdGVwQ29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ZXAubGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnIzYzNjZGMSc7XG4gIH1cblxuICBnZXRTdGVwUmVzdWx0Q29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3Ioc3RlcC5yZXN1bHQpO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyQ29sb3IobGV2ZWw/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBsZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjRkZBNTAwJztcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J10pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlICdTVUNDRVNTJzpcbiAgICAgICAgcmV0dXJuICcjMTJCNzZBJztcbiAgICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgICByZXR1cm4gJyNCOTFDMUMnO1xuICAgICAgY2FzZSAnQUJPUlRFRCc6XG4gICAgICAgIHJldHVybiAnI0Y3OTAwOSc7XG4gICAgICBjYXNlICdTS0lQUEVEJzpcbiAgICAgICAgcmV0dXJuICcjNjY3MDg1JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnIzYzNjZGMSc7XG4gICAgfVxuICB9XG5cbiAgb25NYXJrZXJDbGljayhldmVudDogTW91c2VFdmVudCwgbWFya2VyOiBTdGVwTWFya2VyKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb247XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAobWFya2VyLnRlc3RTdGVwSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb1VybCgpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4LCAwKSwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4gdGhpcy52aWRlb1VybHNbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlkZW9Vcmw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHJlc2V0VmlkZW9TdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IHJlc2V0dGluZycpO1xuXG4gICAgdmlkZW8ucGF1c2UoKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IGNvbXBsZXRlJyk7XG4gIH1cblxuICBwcmV2VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb1VybHMgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA8IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgb25UaW1lbGluZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNsaWNrWCAvIHJlY3Qud2lkdGgpKTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9IHBlcmNlbnQgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTIwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBwZXJjZW50ICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblRpbWVsaW5lQ2xpY2snLCB7XG4gICAgICBwZXJjZW50LFxuICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMOiBDYXB0dXJlIHBsYXlpbmcgc3RhdGUgQkVGT1JFIHBhdXNpbmdcbiAgICAvLyBVc2UgYm90aCBpc1BsYXlpbmcgZmxhZyBhbmQgcGxheWVyU3RhdGUgZm9yIHJlbGlhYmlsaXR5XG4gICAgdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyA9IHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RhcnREcmFnJywge1xuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gZHVyaW5nIGRyYWcgdG8gYXZvaWQgY29uZmxpY3RzXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25EcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4IC8gcmVjdC53aWR0aCwgMSkpO1xuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gcGVyY2VudCAqIDEwMDsgLy8gUGVyLWNsaXAgdGltZWxpbmUgcG9zaXRpb25cbiAgICB9XG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBkcmFnIGVuZGVkJywge1xuICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmc6IHNob3VsZFJlc3VtZVBsYXlpbmcsXG4gICAgICBjdXJyZW50UGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9ICh0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyAvIDEwMCkgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSAodGhpcy5wcm9ncmVzcyAvIDEwMCkgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG5cbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIFxuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiByZXN1bWluZyBwbGF5YmFjayBhZnRlciBzZWVrJywge1xuICAgICAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFdhaXQgYSBiaXQgbG9uZ2VyIHRvIGVuc3VyZSBzZWVrIGlzIGZ1bGx5IGNvbXBsZXRlXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxNTApKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzdGF0ZSBpcyAncGF1c2VkJyBhZnRlciBzZWVrIChzZWVrVG9UaW1lSW50ZXJuYWwgc2V0cyBpdCB0byAncGF1c2VkJylcbiAgICAgICAgLy8gSWYgc3RhdGUgaXMgc3RpbGwgJ3NlZWtpbmcnLCB3YWl0IGEgYml0IG1vcmVcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdzZWVraW5nJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogc2VlayBzdGlsbCBpbiBwcm9ncmVzcywgd2FpdGluZyBtb3JlJyk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3cgcmVzdW1lIHBsYXliYWNrIChzdGF0ZSBzaG91bGQgYmUgJ3BhdXNlZCcgYXQgdGhpcyBwb2ludClcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcGxheWJhY2sgcmVzdW1lZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB1bmV4cGVjdGVkIHN0YXRlIGFmdGVyIHNlZWssIGF0dGVtcHRpbmcgdG8gcmVzdW1lIGFueXdheScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gVHJ5IHRvIHJlc3VtZSBhbnl3YXkgLSBiZXR0ZXIgdG8gdHJ5IHRoYW4gdG8gbGVhdmUgaXQgc3R1Y2tcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdmlkZW8gd2FzIHBhdXNlZCwgbm90IHJlc3VtaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMub25EcmFnKGUpO1xuICAgIH07XG5cbiAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3RvcERyYWcoKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25WaWRlb01ldGFkYXRhTG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvTWV0YWRhdGFMb2FkZWQnKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG4gIFxuICBvblZpZGVvQ2FuUGxheSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0NhblBsYXknKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuXG4gICAgLy8gQ29uc3VtZSBhbnkgcGVuZGluZyByZWNvdmVyeSBzdGF0ZSBxdWV1ZWQgYnkgb25WaWRlb0Vycm9yKCk6IHNlZWsgYmFjayB0b1xuICAgIC8vIHdoZXJlIHBsYXliYWNrIGVycm9yZWQgYW5kIGF1dG8tcmVzdW1lIGlmIHdlIHdlcmUgcGxheWluZyBhdCB0aGUgdGltZS5cbiAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlZWtTZWMgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWM7XG4gICAgICBjb25zdCBzaG91bGRQbGF5ID0gdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5O1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjID0gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlZWtTZWMsIHZpZGVvLmR1cmF0aW9uKSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHsgLyogZWxlbWVudCBtYXkgbm90IGJlIHNlZWthYmxlIHlldDsgaGFybWxlc3MgKi8gfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFBsYXkpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgODApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBOYXRpdmUgZXJyb3ItZXZlbnQgaGFuZGxlciBmb3IgdGhlIG1haW4gPHZpZGVvPiBlbGVtZW50LiBUaGUgQ2hyb21lIG1lZGlhXG4gICAqIHN0YWNrIG9jY2FzaW9uYWxseSB0aHJvd3MgXCJQaXBlbGluZVN0YXR1czo6UElQRUxJTkVfRVJST1JfUkVBRDogRkZtcGVnRGVtdXhlcjpcbiAgICogZGF0YSBzb3VyY2UgZXJyb3JcIiBkdXJpbmcgcGxheWJhY2sgYWZ0ZXIgYSBicmllZiBuZXR3b3JrIGJsaXAgb3IgYSBidXJzdCBvZlxuICAgKiBmYXN0IHVzZXIgYWN0aW9uczsgb25jZSB0aGF0IGhhcHBlbnMgdGhlIGVsZW1lbnQgYmVjb21lcyB1bnJlc3BvbnNpdmUgdG9cbiAgICogcGxheS9wYXVzZS9zZWVrLiBXZSByZWNvdmVyIGJ5IHVubW91bnRpbmcrcmVtb3VudGluZyB0aGUgPHZpZGVvPiB2aWEgKm5nSWZcbiAgICog4oCUIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGF0IG1ha2VzIHRoZSBTY3JlZW5zaG90c+KGlFZpZGVvIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZFxuICAgKiB3b3JrIHRvZGF5IOKAlCB0aGVuIHJlc3RvcmUgdGhlIHByZS1lcnJvciBwbGF5aGVhZCBhbmQgcmVzdW1lIHBsYXliYWNrLiAqL1xuICBvblZpZGVvRXJyb3IoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZXJyID0gdmlkZW8/LmVycm9yO1xuXG4gICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gb25WaWRlb0Vycm9yIOKAlCB0cmlnZ2VyaW5nIGF1dG8tcmVjb3ZlcnknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGVycm9yQ29kZTogZXJyPy5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnI/Lm1lc3NhZ2UsXG4gICAgICBuZXR3b3JrU3RhdGU6IHZpZGVvPy5uZXR3b3JrU3RhdGUsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlbz8ucmVhZHlTdGF0ZSxcbiAgICAgIGN1cnJlbnRWaWRlb0luZGV4OiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4LFxuICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgIGF0dGVtcHRzOiB0aGlzLnJlY292ZXJ5QXR0ZW1wdHNcbiAgICB9KTtcblxuICAgIC8vIEJvdW5kIHRoZSByZXRyeSBidWRnZXQgdG8gYSByb2xsaW5nIHdpbmRvdyBzbyBhIHBlcnNpc3RlbnRseSBicm9rZW5cbiAgICAvLyBzb3VyY2UgKDQwNCwgdW5zdXBwb3J0ZWQgY29kZWMsIOKApikgZG9lc24ndCBmbGFwIGZvcmV2ZXIuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA+IHRoaXMuUkVDT1ZFUllfV0lORE9XX01TKSB7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IG5vdztcbiAgICB9XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzKys7XG4gICAgaWYgKHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA+IHRoaXMuTUFYX1JFQ09WRVJZX0FUVEVNUFRTKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3I6IGV4Y2VlZGVkIHJlY292ZXJ5IGF0dGVtcHRzLCBnaXZpbmcgdXAnKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB3aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSBhZnRlciB0aGUgcmVtb3VudC5cbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSAodmlkZW8gJiYgaXNGaW5pdGUodmlkZW8uY3VycmVudFRpbWUpKSA/IHZpZGVvLmN1cnJlbnRUaW1lIDogMDtcbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXkgPSB0aGlzLmlzUGxheWluZztcblxuICAgIC8vIFB1dCB0aGUgc3RhdGUgbWFjaGluZSBpbnRvICdlcnJvcicgc28gb25WaWRlb0VsZW1lbnRSZWFkeSByZXNldHMgaXRcbiAgICAvLyBiYWNrIHRvICdpZGxlJyB3aGVuIHRoZSByZW1vdW50ZWQgZWxlbWVudCBhcnJpdmVzLlxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIC8vIFVubW91bnQg4oaSIHJlbW91bnQuIEJyaWVmIDEwMG1zIGdhcCBtaXJyb3JzIHRoZSB0YWItc3dpdGNoIHdvcmthcm91bmQuXG4gICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblZpZGVvRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIC8vIFN3aXRjaCB0byBuZXh0IHZpZGVvIGFuZCBhdXRvLXBsYXkgaXRcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDE7XG5cbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwobmV4dEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFZpZGVvTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IDEwMCkgcmV0dXJuO1xuXG4gICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcblxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3N3aXRjaGluZycpIHtcbiAgICAgICAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoY3VycmVudE1zIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuY2hlY2tNYXJrZXJIaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICB0aGlzLm1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk7XG5cbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0aGUgbGlicmFyeSByb3cgc28gdGhlIGN1cnJlbnRseS1wbGF5aW5nIGNsaXAgc3RheXMgdmlzaWJsZS5cbiAgICAgICAgICAvLyBPbmx5IHdoaWxlIHBsYXlpbmc7IHdoZW4gcGF1c2VkIHdlIGxlYXZlIHRoZSByb3cgd2hlcmUgdGhlIHVzZXIgbGVmdCBpdC5cbiAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleDtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3VycmVudENsaXBJbnRvVmlldygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuXG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXItaW5pdGlhdGVkIG5hdmlnYXRpb24g4oCUIHJlc2V0IHRoZSBhdXRvLXJlY292ZXJ5IHJldHJ5IGJ1ZGdldC5cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVXNlci1pbml0aWF0ZWQgc2VlayDigJQgcmVzZXQgdGhlIGF1dG8tcmVjb3ZlcnkgcmV0cnkgYnVkZ2V0LlxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IDA7XG5cbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0NhcHR1cmVWaWRlbyAmJiBpc0xpdmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImlzQ2FwdHVyaW5nVmlkZW9cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhcHR1cmluZ1ZpZGVvXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVZpZGVvKClcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NhcHR1cmluZ1ZpZGVvXCIgY2xhc3M9XCJjYXB0dXJlLXZpZGVvLWJ0bl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDYXB0dXJpbmdWaWRlb1wiIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5fX3NwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgaXNDYXB0dXJpbmdWaWRlbyA/ICdDYXB0dXJpbmfigKYnIDogJ0NhcHR1cmUgVmlkZW8nIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTGFiZWwgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlkZW8gVmlldzogcG9zdC1leGVjdXRpb24gVmlkZW8gdGFiLCBvciBtaWQtc2Vzc2lvbiBDYXB0dXJlZCB2aWV3IGluc2lkZSBhIGxpdmUgc2Vzc2lvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgKCghaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nKSB8fCAoaXNMaXZlICYmIGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJykpXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTEwOHB4KV0nOiBzaG93VmlkZW9MaWJyYXJ5LCAnY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldJzogIXNob3dWaWRlb0xpYnJhcnl9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUsMyAxOSwxMiA1LDIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8IS0tIFZpZGVvIExpYnJhcnkgUGFuZWwg4oCUIHJlc2VydmVzIG9ubHkgaGVhZGVyLWhlaWdodCBpbiBmbG93OyB0aGUgaW5uZXIgcGFuZWwgaXMgYWJzb2x1dGVseSBhbmNob3JlZCB0byBpdHMgYm90dG9tIGVkZ2UsIHNvIHRoZSBib2R5IGV4cGFuZGluZyBtYWtlcyB0aGUgcGFuZWwgZ3JvdyBVUFdBUkQgb3ZlciB0aGUgdmlkZW8uIFRpbWVsaW5lIHN0YXlzIHB1dC4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cInZpZGVvLWxpYnJhcnlcIlxuICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2lubmVyXCI+XG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBhbHdheXMgdmlzaWJsZSwgY2xpY2tpbmcgdGhlIGNoZXZyb24gdG9nZ2xlcyB0aGUgYm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2hlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlkZW8tbGlicmFyeV9faWNvblwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzOTggNy41ODMwOEwxMi4zODA3IDkuNjE0MjVDMTIuNDI0NyA5LjY0MzQ4IDEyLjQ3NTcgOS42NjAyNCAxMi41Mjg0IDkuNjYyNzZDMTIuNTgxMSA5LjY2NTI4IDEyLjYzMzUgOS42NTM0NyAxMi42OCA5LjYyODU2QzEyLjcyNjUgOS42MDM2NiAxMi43NjU0IDkuNTY2NjEgMTIuNzkyNSA5LjUyMTM2QzEyLjgxOTYgOS40NzYxIDEyLjgzNCA5LjQyNDM0IDEyLjgzNCA5LjM3MTU4VjQuNTkwNThDMTIuODM0IDQuNTM5MjYgMTIuODIwNSA0LjQ4ODg1IDEyLjc5NDggNC40NDQ0M0MxMi43NjkxIDQuNDAwMDEgMTIuNzMyMSA0LjM2MzE1IDEyLjY4NzYgNC4zMzc1OUMxMi42NDMxIDQuMzEyMDMgMTIuNTkyNiA0LjI5ODY2IDEyLjU0MTMgNC4yOTg4M0MxMi40OSA0LjI5OSAxMi40Mzk2IDQuMzEyNzIgMTIuMzk1MyA0LjMzODU4TDkuMzMzOTggNi4xMjQ3NVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgMy41SDIuMzMyNjhDMS42ODgzNSAzLjUgMS4xNjYwMiA0LjAyMjMzIDEuMTY2MDIgNC42NjY2N1Y5LjMzMzMzQzEuMTY2MDIgOS45Nzc2NyAxLjY4ODM1IDEwLjUgMi4zMzI2OCAxMC41SDguMTY2MDJDOC44MTAzNSAxMC41IDkuMzMyNjggOS45Nzc2NyA5LjMzMjY4IDkuMzMzMzNWNC42NjY2N0M5LjMzMjY4IDQuMDIyMzMgOC44MTAzNSAzLjUgOC4xNjYwMiAzLjVaXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGVcIj5WaWRlbyBMaWJyYXJ5PC9zcGFuPlxuICAgICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBpbmxpbmVTdHlsZXM9XCJtaW4td2lkdGg6IG1heC1jb250ZW50O1wiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFREU5RkVcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCIjNkQyOEQ5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInZpZGVvVXJscy5sZW5ndGggKyAnIGNsaXAnICsgKHZpZGVvVXJscy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJylcIj5cbiAgICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc1ZpZGVvRnVsbE1vZGUgPyAnUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ0VhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZSdcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj57eyBpc1ZpZGVvRnVsbE1vZGUgPyAnwrcgUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ8K3IEVhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZScgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIlNob3cgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0Z1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIkV4aXQgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uRXhpdEZ1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2NvbGxhcHNlXCIgKGNsaWNrKT1cInRvZ2dsZVZpZGVvTGlicmFyeUNvbGxhcHNlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/ICdTaG93IHZpZGVvIGxpYnJhcnknIDogJ0hpZGUgdmlkZW8gbGlicmFyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41TDYgNC41TDkgNy41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDcuNUw5IDQuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvZHkgKGNhcmRzKSDigJQgbWF4LWhlaWdodCBhbmltYXRlcyBmcm9tIDAgKGNvbGxhcHNlZCkgdG8gYSBmaXhlZCBoZWlnaHQgKG9wZW4pLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2JvZHlcIlxuICAgICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5X19ib2R5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwcy1yb3dcIlxuICAgICAgICAgICAgICAgI2NsaXBzU2Nyb2xsZXJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwcy1yb3ctLWRyYWdnaW5nXT1cImNsaXBzRHJhZ0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xpcHNNb3VzZURvd24oJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2xpcHNNb3VzZU1vdmUoJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2V1cCk9XCJvbkNsaXBzTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2xpcHNNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVybCBvZiB2aWRlb1VybHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrTGlicmFyeUNsaXBCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1jYXJkLS1wbGF5aW5nXT1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC10aHVtYi0tcmVhZHldPVwibGlicmFyeVZpZGVvRHVyYXRpb25zLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpYnJhcnlDbGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjY2xpcFZpZGVvXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtdGh1bWJfX3ZpZGVvXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgbXV0ZWRcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiXG4gICAgICAgICAgICAgICAgICAoZHVyYXRpb25jaGFuZ2UpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIj48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19vdmVybGF5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fcGxheS1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiEoaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjc1TDExLjM3NSA3TDMuNSAxMi4yNVYxLjc1WlwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLXBsYXlpbmdcIj5QTEFZSU5HPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3VmlkZW9JbmRleGVzLmhhcyhpKSAmJiBpICE9PSBjdXJyZW50VmlkZW9JbmRleFwiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLW5ld1wiPk5FVzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsaXAtdGh1bWJfX2R1cmF0aW9uXCI+e3sgZm9ybWF0VGltZShsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuZ2V0KGkpIHx8IDApIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFfX3RpdGxlXCI+Q2xpcCB7eyBpICsgMSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1kb3dubG9hZC1idG4tLWRvd25sb2FkaW5nXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2xpcChpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWdtYSBpY29uOiB1cHdhcmQgYXJyb3cgd2l0aCBhIHNob3J0IHRyYXkgbGluZSBhdCB0aGUgYm90dG9tIChzaGFyZS9leHBvcnQgZ2x5cGgpLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgOC41VjJNNiAyTDMgNU02IDJMOSA1TTMgMTAuNUg5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0bl9fcmluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA3IDcpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG93bmxvYWRQcm9ncmVzcy5nZXQoaSkgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lICYmICEoc2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDApfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICghaXNMaXZlIHx8IGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJylcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKGdsb2JhbEN1cnJlbnRUaW1lTXMgLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwMTtcIj5cbiAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgICAgICBbc2VnbWVudHNdPVwic3BlZWRTZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRTcGVlZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRhaW5lckJnQ29sb3JdPVwiJyNGMEYwRjEnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TcGVlZENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRpbWVsaW5lQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgKGlzVmlkZW9GdWxsTW9kZSA/IGZ1bGxWaWRlb01hcmtlcnMgOiBjdXJyZW50VmlkZW9NYXJrZXJzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcikgOiBnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC0xLzIgY3FhLXctMyBjcWEtaC0zIGNxYS1iZy1ibHVlLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDYwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItMlwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiAhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHNjcmVlbnNob3ROb0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tYXgtaC1baW5oZXJpdF0nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1tYXgtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
2474
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltdWxhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2ltdWxhdG9yL3NpbXVsYXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NpbXVsYXRvci9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUErRixZQUFZLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTlOLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7Ozs7Ozs7O0FBNkNuRixNQUFNLE9BQU8sa0JBQWtCO0lBd2U3QixZQUNVLFNBQXVCLEVBQ3ZCLEdBQXNCO1FBRHRCLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUF4ZXZCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBaUIsRUFBRSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsY0FBYyxDQUFDO1FBQ3RDLGlCQUFZLEdBQXlCLFNBQVMsQ0FBQztRQUMvQyxhQUFRLEdBQVcsRUFBRSxDQUFDO1FBQ3RCLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFDeEIsZUFBVSxHQUE2RSxhQUFhLENBQUM7UUFDckcscUJBQWdCLEdBQVcsWUFBWSxDQUFDO1FBQ3hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUN2Qyx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsMkJBQXNCLEdB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YztzQkFEYixZQUFZO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEhvc3RMaXN0ZW5lciwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVJlc291cmNlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRFbXB0eVN0YXRlUHJlc2V0IH0gZnJvbSAnLi4vZW1wdHktc3RhdGUvZW1wdHktc3RhdGUtcHJlc2V0cy5jb25zdGFudHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZhc3RGb3J3YXJkQ29uZmlnIHtcbiAgZnJvbVN0ZXA6IG51bWJlcjtcbiAgdG9TdGVwOiBudW1iZXI7XG4gIGN1cnJlbnRTdGVwOiBudW1iZXI7XG4gIHRvdGFsU3RlcHM6IG51bWJlcjtcbiAgdGFyZ2V0U3RlcE51bWJlcjogc3RyaW5nO1xuICB0YXJnZXRTdGVwTGFiZWw6IHN0cmluZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBNYXJrZXIge1xuICBjdW11bGF0aXZlRHVyYXRpb246IG51bWJlcjtcbiAgcmVzdWx0OiAnU1VDQ0VTUycgfCAnRkFJTFVSRScgfCAnQUJPUlRFRCcgfCAnU0tJUFBFRCc7XG4gIHRlc3RTdGVwSWQ/OiBudW1iZXI7XG4gIGxldmVsPzogbnVtYmVyO1xuICBjaGlsZFN0ZXBzPzogU3RlcE1hcmtlcltdO1xuICB0aXRsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgU2VnbWVudFR5cGUgPSAnc2NyZWVuc2hvdHMnIHwgJ3ZpZGVvJyB8ICd0cmFjZSc7XG5cbnR5cGUgU2VnbWVudE9wdGlvbiA9IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbn07XG5pbnRlcmZhY2UgRGV2aWNlRnJhbWVDb25maWcge1xuICBtb2NrdXBJbWFnZTogc3RyaW5nO1xuICBzY3JlZW5JbnNldDoge1xuICAgIHRvcDogc3RyaW5nO1xuICAgIHJpZ2h0OiBzdHJpbmc7XG4gICAgYm90dG9tOiBzdHJpbmc7XG4gICAgbGVmdDogc3RyaW5nO1xuICB9O1xuICBib3JkZXJSYWRpdXM6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXNpbXVsYXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW11bGF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdXG59KVxuXG5leHBvcnQgY2xhc3MgU2ltdWxhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHZpZGVvVXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdmlkZW9VcmxzOiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSB2aWRlb0N1cnJlbnREdXJhdGlvbjogbnVtYmVyID0gMDtcbiAgQElucHV0KCkgc3RlcE1hcmtlcnM6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzY3JlZW5TaG90VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgdHJhY2VWaWV3VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcGxhdGZvcm1OYW1lOiBzdHJpbmcgPSAnV2ViIC0gQ2hyb21lJztcbiAgQElucHV0KCkgcGxhdGZvcm1UeXBlOiAnYnJvd3NlcicgfCAnZGV2aWNlJyA9ICdicm93c2VyJztcbiAgQElucHV0KCkgcGxhdGZvcm06IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBkZXZpY2VOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgaXNMaXZlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGxpdmVTdGF0dXM6ICdJbiBQcm9ncmVzcycgfCAnUGF1c2VkJyB8ICdBYm9ydGVkJyB8ICdGYWlsZWQnIHwgJ1Bhc3NlZCcgfCAnRXhlY3V0aW9uJyA9ICdJbiBQcm9ncmVzcyc7XG4gIEBJbnB1dCgpIGxpdmVMb2FkaW5nTGFiZWw6IHN0cmluZyA9ICdMb2FkaW5nLi4uJztcbiAgQElucHV0KCkgaXNDb250ZW50VmlkZW9Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhaWxlZFN0YXR1c01lc3NhZ2U6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpc1ZOQ1Nlc3Npb25JbnRydXBwdGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZuY1Nlc3Npb25JbnR1cHB0ZWRNZXNzYWdlOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc2VsZWN0ZWRWaWV3OiBTZWdtZW50VHlwZSA9ICd2aWRlbyc7XG4gIEBJbnB1dCgpIGhpZGVWaWRlb1RhYjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBicm93c2VyVmlld1BvcnQ6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBicm93c2VyRGV2aWNlOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKSBpc0Zhc3RGb3J3YXJkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZhc3RGb3J3YXJkQ29uZmlnOiBGYXN0Rm9yd2FyZENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHNob3dWaWRlb0xpYnJhcnk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0NhcHR1cmVWaWRlbzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0NhcHR1cmluZ1ZpZGVvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gV2hlbiBgaXNMaXZlYCBhbmQgYXQgbGVhc3Qgb25lIGNsaXAgaXMgcHJlc2VudCBpbiBgdmlkZW9VcmxzYCwgdGhlIHNpbXVsYXRvclxuICAvLyBoZWFkZXIgc2hvd3MgYSBMaXZlL0NhcHR1cmVkIHNlZ21lbnQgY29udHJvbC4gUGFyZW50IGNhbiBhbHNvIGRyaXZlIHRoZSB2aWV3XG4gIC8vIGltcGVyYXRpdmVseSAoZS5nLiBcIldhdGNoIE5vd1wiIGJ1dHRvbiBpbiB0aGUgY2FwdHVyZSBkaWFsb2cpIGJ5IHB1c2hpbmcgYVxuICAvLyBuZXcgdmFsdWUgdGhyb3VnaCB0aGlzIGlucHV0LlxuICBASW5wdXQoKSBsaXZlU2Vzc2lvblZpZXc6ICdsaXZlJyB8ICdjYXB0dXJlZCcgPSAnbGl2ZSc7XG5cbiAgZ2V0IGZhc3RGb3J3YXJkUHJvZ3Jlc3NQZXJjZW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgYyA9IHRoaXMuZmFzdEZvcndhcmRDb25maWc7XG4gICAgaWYgKCFjIHx8ICFjLnRvdGFsU3RlcHMpIHJldHVybiAwO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIChjLmN1cnJlbnRTdGVwIC8gYy50b3RhbFN0ZXBzKSAqIDEwMCk7XG4gIH1cblxuICBAT3V0cHV0KCkgdmlkZW9UaW1lVXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BsYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSB2aWRlb1BhdXNlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWFya2VySGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdGVwTWFya2VyPigpO1xuICBAT3V0cHV0KCkgaXNWaWRlb1BsYXlpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjYXB0dXJlVmlkZW9SZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBsaXZlU2Vzc2lvblZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPCdsaXZlJyB8ICdjYXB0dXJlZCc+KCk7XG5cbiAgcHJpdmF0ZSBfdnBsYXllcj86IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndnBsYXllcicpXG4gIHNldCB2cGxheWVyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghcmVmKSB7XG4gICAgICAvLyBFbGVtZW50IGlzIGJlaW5nIHVubW91bnRlZCAoZS5nLiB1c2VyIHRvZ2dsZWQgZnJvbSBDYXB0dXJlZCDihpIgTGl2ZSBkdXJpbmcgYVxuICAgICAgLy8gbWlkLWZsaWdodCBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCkuIERyb3AgdGhlIHN0YWxlIHJlZmVyZW5jZSBzbyBhbnlcbiAgICAgIC8vIGZvbGxvdy11cCBhdHRlbXB0IHRvIG9wZXJhdGUgb24gLm5hdGl2ZUVsZW1lbnQgc2hvcnQtY2lyY3VpdHMgb3V0IGNsZWFubHkuXG4gICAgICB0aGlzLl92cGxheWVyID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZwbGF5ZXIgPSByZWY7XG4gICAgdGhpcy5vblZpZGVvRWxlbWVudFJlYWR5KCk7XG4gIH1cblxuICBnZXQgdnBsYXllcigpOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdnBsYXllcjtcbiAgfVxuXG4gIHByaXZhdGUgX3RpbWVsaW5lQmFyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQFZpZXdDaGlsZCgndGltZWxpbmVCYXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHRpbWVsaW5lQmFyUmVmKHJlZjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIXJlZikgcmV0dXJuO1xuICAgIHRoaXMuX3RpbWVsaW5lQmFyID0gcmVmO1xuICB9XG5cbiAgZ2V0IHRpbWVsaW5lQmFyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZWxpbmVCYXI7XG4gIH1cblxuICBwcml2YXRlIF9zcGVlZENvbnRyb2xDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKCdzcGVlZENvbnRyb2xDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgc2V0IHNwZWVkQ29udHJvbENvbnRhaW5lclJlZihyZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFyZWYpIHJldHVybjtcbiAgICB0aGlzLl9zcGVlZENvbnRyb2xDb250YWluZXIgPSByZWY7XG4gIH1cblxuICBnZXQgc3BlZWRDb250cm9sQ29udGFpbmVyKCk6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BlZWRDb250cm9sQ29udGFpbmVyO1xuICB9XG5cbiAgcHJvZ3Jlc3MgPSAwO1xuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBpc1BsYXlpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1BsYXlQYXVzZU92ZXJsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwbGF5UGF1c2VPdmVybGF5VGltZXI6IGFueSA9IG51bGw7XG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBjdXJyZW50Vmlldzogc3RyaW5nID0gJ3ZpZGVvJztcbiAgY3VycmVudFZpZGVvSW5kZXg6IG51bWJlciA9IDA7XG4gIGN1cnJlbnRTcGVlZDogc3RyaW5nID0gJzF4JztcbiAgaXNTcGVlZENvbnRyb2xPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uczogbnVtYmVyW10gPSBbXTsgLy8gQWN0dWFsIGR1cmF0aW9ucyBkZXRlY3RlZCBmcm9tIHZpZGVvIG1ldGFkYXRhXG4gIHByaXZhdGUgd2FzUGxheWluZ0JlZm9yZURyYWc6IGJvb2xlYW4gPSBmYWxzZTsgLy8gVHJhY2sgaWYgdmlkZW8gd2FzIHBsYXlpbmcgYmVmb3JlIGRyYWcgc3RhcnRlZFxuICBwcml2YXRlIHBsYXlQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7IC8vIFRyYWNrIHRoZSBjdXJyZW50IHBsYXkgcHJvbWlzZVxuICBwcml2YXRlIGhpdE1hcmtlcnM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpOyAvLyBUcmFjayB3aGljaCBtYXJrZXJzIGhhdmUgYmVlbiBoaXQgKGJ5IHRlc3RTdGVwSWQpXG5cbiAgLy8gU3RhdGUgbWFjaGluZSBmb3Igcm9idXN0IG1lZGlhIG9wZXJhdGlvbnNcbiAgcHJpdmF0ZSBwbGF5ZXJTdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ3JlYWR5JyB8ICdwbGF5aW5nJyB8ICdwYXVzZWQnIHwgJ3NlZWtpbmcnIHwgJ3N3aXRjaGluZycgfCAnZXJyb3InID0gJ2lkbGUnO1xuICBwcml2YXRlIG9wZXJhdGlvblF1ZXVlOiBQcm9taXNlPHZvaWQ+ID0gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIFNlcmlhbGl6ZSBhbGwgbWVkaWEgb3BlcmF0aW9uc1xuXG4gIC8vIFZpZGVvLW9uLWRlbWFuZCAoVmlkZW8gTGlicmFyeSkgc3RhdGUg4oCUIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggaXMgYHZpZGVvVXJsc2AuXG4gIC8vIGBuZXdWaWRlb0luZGV4ZXNgIG1hcmtzIHdoaWNoIGluZGV4ZXMgd2VyZSBqdXN0IGNhcHR1cmVkIChzbyB3ZSBjYW4gc2hvdyB0aGVcbiAgLy8gTkVXIGJhZGdlIHVudGlsIHRoYXQgY2xpcCBpcyBzZWxlY3RlZCk7IGBsaWJyYXJ5VmlkZW9EdXJhdGlvbnNgIGNhY2hlcyB0aGVcbiAgLy8gbWV0YWRhdGEtbG9hZGVkIGR1cmF0aW9uIHBlciBpbmRleCBmb3IgZWFjaCBsaWJyYXJ5IGNhcmQncyB0aHVtYm5haWwuXG4gIGlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgbmV3VmlkZW9JbmRleGVzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBsaWJyYXJ5VmlkZW9EdXJhdGlvbnM6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBkb3dubG9hZGluZ0luZGV4ZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGRvd25sb2FkUHJvZ3Jlc3M6IE1hcDxudW1iZXIsIG51bWJlcj4gPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyAwLTEwMCBwZXIgY2xpcCBpbmRleFxuICBAVmlld0NoaWxkcmVuKCdjbGlwVmlkZW8nKSBjbGlwVmlkZW9zPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4+O1xuICBAVmlld0NoaWxkKCdjbGlwc1Njcm9sbGVyJykgY2xpcHNTY3JvbGxlclJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBwcml2YXRlIGxhc3RMaWJyYXJ5U3luY0tleTogc3RyaW5nID0gJyc7XG4gIC8vIFRyYWNrcyB3aGljaCBjbGlwIGluZGV4IHRoZSBsaWJyYXJ5IHJvdyB3YXMgbGFzdCBhdXRvLXNjcm9sbGVkIHRvLCBzbyB0aGVcbiAgLy8gdGltZXVwZGF0ZSBoYW5kbGVyIGRvZXNuJ3QgcmUtdHJpZ2dlciBhIHNjcm9sbCBldmVyeSBmcmFtZS5cbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsZWRDbGlwSW5kZXg6IG51bWJlciA9IC0xO1xuXG4gIC8vIEF1dG8tcmVjb3Zlcnk6IHdoZW4gdGhlIDx2aWRlbz4gZmlyZXMgYW4gZXJyb3IgZXZlbnQgKGUuZy4gQ2hyb21lJ3NcbiAgLy8gXCJQSVBFTElORV9FUlJPUl9SRUFEOiBGRm1wZWdEZW11eGVyXCIgYWZ0ZXIgYSBuZXR3b3JrIGdsaXRjaCksIHdlIGZsaXBcbiAgLy8gdGhpcyBmbGFnIHRvIHVubW91bnQgdGhlIDx2aWRlbz4gdmlhICpuZ0lmLCB0aGVuIGZsaXAgaXQgYmFjayBzbyBBbmd1bGFyXG4gIC8vIHJlbW91bnRzIGEgZnJlc2ggZWxlbWVudCDigJQgdGhlIHNhbWUgbWVjaGFuaXNtIHRoYXQgbWFrZXMgdGhlXG4gIC8vIFNjcmVlbnNob3Rz4oaUVmlkZW8gdGFiLXN3aXRjaCB3b3JrYXJvdW5kIHJlY292ZXIgcGxheWJhY2sgdG9kYXkuXG4gIHZpZGVvUmVmcmVzaGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVNlZWtTZWM6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdSZWNvdmVyeVBsYXk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWNvdmVyeUF0dGVtcHRzOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlY292ZXJ5QXR0ZW1wdFdpbmRvd1N0YXJ0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9SRUNPVkVSWV9BVFRFTVBUUyA9IDEwO1xuICBwcml2YXRlIHJlYWRvbmx5IFJFQ09WRVJZX1dJTkRPV19NUyA9IDEwXzAwMDtcblxuICAvLyBQaGFzZSAyIOKAlCBcIlNob3cgRnVsbCBWaWRlb1wiIG1vZGUuIFdoZW4gdHJ1ZSwgdGhlIG1haW4gdGltZWxpbmUgc3BhbnMgdGhlIHRvdGFsXG4gIC8vIGR1cmF0aW9uIGFjcm9zcyBhbGwgY2xpcHMgYW5kIHN0ZXAgbWFya2VycyBmcm9tIGV2ZXJ5IGNsaXAgYXJlIGxhaWQgb3V0IG9uIGl0LlxuICAvLyBDbGlwLXRvLWNsaXAgdHJhbnNpdGlvbnMgaGFwcGVuIHVuZGVyIHRoZSBob29kIHZpYSB0aGUgZXhpc3Rpbmcgb25WaWRlb0VuZGVkXG4gIC8vIGF1dG8tYWR2YW5jZSBwYXRoIOKAlCB0aGUgdXNlciBkb2Vzbid0IHNlZSBhIHJlc2V0LlxuICBpc1ZpZGVvRnVsbE1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gMC0xMDAgcG9zaXRpb24gb24gdGhlIGdsb2JhbCB0aW1lbGluZSB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmVseSBkcmFnZ2luZy5cbiAgLy8gTmVlZGVkIGJlY2F1c2UgYHByb2dyZXNzYCBpcyBwZXItY3VycmVudC1jbGlwIGFuZCB3b3VsZCBnaXZlIHRoZSB3cm9uZyB2YWx1ZS5cbiAgZ2xvYmFsRHJhZ1Byb2dyZXNzOiBudW1iZXIgPSAwO1xuXG4gIC8vIERyYWctdG8tc2Nyb2xsIHN0YXRlIGZvciB0aGUgY2xpcHMgcm93IChtb3VzZSBlcXVpdmFsZW50IG9mIHRvdWNoLXN3aXBlKS5cbiAgcHJpdmF0ZSBjbGlwc0RyYWdTdGF0ZSA9IHsgZHJhZ2dpbmc6IGZhbHNlLCBzdGFydFg6IDAsIHN0YXJ0U2Nyb2xsTGVmdDogMCwgZGlkTW92ZTogZmFsc2UgfTtcbiAgY2xpcHNEcmFnQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZ2V0IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSgpOiAnYnJvd3NlcicgfCAnZGV2aWNlJyB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJykgcmV0dXJuICdkZXZpY2UnO1xuICAgIGlmICh0aGlzLnJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCkpIHJldHVybiAnZGV2aWNlJztcbiAgICByZXR1cm4gJ2Jyb3dzZXInO1xuICB9XG5cbiAgZ2V0IGhhc0RldmljZUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZGV2aWNlRnJhbWVDb25maWc7XG4gIH1cblxuICBnZXQgaXNQbGF5ZXJTd2l0Y2hpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyU3RhdGUgPT09ICdzd2l0Y2hpbmcnO1xuICB9XG5cblxuICBnZXQgaXNBc3BlY3RSYXRpb01hdGNoZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3Qgd2luZG93QXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB2aWV3cG9ydEFyID0gdGhpcy5lZmZlY3RpdmVCcm93c2VyVmlld1BvcnQud2lkdGggLyB0aGlzLmVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgdG9sZXJhbmNlID0gMC4xNTtcbiAgICByZXR1cm4gTWF0aC5hYnMod2luZG93QXIgLSB2aWV3cG9ydEFyKSAvIHZpZXdwb3J0QXIgPCB0b2xlcmFuY2U7XG4gIH1cblxuICBnZXQgbGl2ZUNvbnRlbnRDb250YWluZXJTdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3NlcicpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzQXNwZWN0UmF0aW9NYXRjaGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXhIZWlnaHQ6IGAke01hdGgubWF4KDIwMCwgd2luZG93LmlubmVySGVpZ2h0IC0gMjAwKX1weGAsXG4gICAgICAgIGhlaWdodDogJzEwMCUnXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBzZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICdTY3JlZW5zaG90cycsIHZhbHVlOiAnc2NyZWVuc2hvdHMnLCBpY29uOiAncGhvdG8nICB9LFxuICAgIHsgbGFiZWw6ICdWaWRlbycsIHZhbHVlOiAndmlkZW8nLCBpY29uOiAndmlkZW9jYW0nIH0sXG4gIF07XG5cbiAgc3BlZWRTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgIHsgbGFiZWw6ICcxeCcsIHZhbHVlOiAnMXgnIH0sXG4gICAgeyBsYWJlbDogJzJ4JywgdmFsdWU6ICcyeCcgfSxcbiAgICB7IGxhYmVsOiAnNXgnLCB2YWx1ZTogJzV4JyB9LFxuICBdO1xuXG4gIGxpdmVTZXNzaW9uU2VnbWVudHM6IFNlZ21lbnRPcHRpb25bXSA9IFtcbiAgICB7IGxhYmVsOiAnTGl2ZScsIHZhbHVlOiAnbGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZWQnLCB2YWx1ZTogJ2NhcHR1cmVkJyB9LFxuICBdO1xuXG4gIG9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKG5leHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc29sdmVkOiAnbGl2ZScgfCAnY2FwdHVyZWQnID0gKG5leHQgPT09ICdjYXB0dXJlZCcgPyAnY2FwdHVyZWQnIDogJ2xpdmUnKTtcbiAgICBpZiAocmVzb2x2ZWQgIT09IHRoaXMubGl2ZVNlc3Npb25WaWV3KSB7XG4gICAgICB0aGlzLmxpdmVTZXNzaW9uVmlldyA9IHJlc29sdmVkO1xuICAgICAgdGhpcy5yZXNldExpdmVTZXNzaW9uUGxheWJhY2tTdGF0ZSgpO1xuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXdDaGFuZ2UuZW1pdChyZXNvbHZlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc2V0IHRoZSB2aWRlbyBwbGF5ZXIgdG8gYSBjbGVhbiBzbGF0ZSB3aGVuZXZlciB0aGUgTGl2ZS9DYXB0dXJlZCB2aWV3IHRvZ2dsZXNcbiAgICogIGR1cmluZyBhbiBhY3RpdmUgZGVidWcgc2Vzc2lvbi4gUGF1c2VzIHBsYXliYWNrLCBleGl0cyBGdWxsIFZpZGVvIG1vZGUsIHJld2luZHNcbiAgICogIHRvIGNsaXAgMCwgYW5kIGNsZWFycyBkcmFnL3Njcm9sbC9tYXJrZXIgc3RhdGUuXG4gICAqXG4gICAqICBBcHBsaWVkIHN5bmNocm9ub3VzbHkgKG5vIG9wZXJhdGlvblF1ZXVlKSBiZWNhdXNlIHRoZSB0b2dnbGUgdXN1YWxseSBhbHNvXG4gICAqICB1bm1vdW50cy9yZW1vdW50cyB0aGUgPHZpZGVvPiBlbGVtZW50IOKAlCBhbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiB0aGUgb2xkXG4gICAqICBlbGVtZW50IGlzIGFscmVhZHkgZGVhZCwgYW5kIGEgZnJlc2ggZWxlbWVudCBuYXR1cmFsbHkgbW91bnRzIHdpdGhcbiAgICogIGBzcmMgPSB2aWRlb1VybHNbMF1gIGZyb20gYGN1cnJlbnRWaWRlb1VybGAuIEVucXVldWVpbmcgaGVyZSB3b3VsZCByYWNlIHdpdGhcbiAgICogIHRoZSBlbGVtZW50IGxpZmVjeWNsZSBhbmQgZWl0aGVyIGdldCBkaXNjYXJkZWQgb3IgYmxvY2sgdGhlIHF1ZXVlLiAqL1xuICBwcml2YXRlIHJlc2V0TGl2ZVNlc3Npb25QbGF5YmFja1N0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNWaWRlb0Z1bGxNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTY3JvbGxlZENsaXBJbmRleCA9IC0xO1xuICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHZpZGVvKSB7XG4gICAgICB0cnkgeyB2aWRlby5wYXVzZSgpOyB9IGNhdGNoIHsgLyogZGV0YWNoZWQgZWxlbWVudCDigJQgaWdub3JlICovIH1cbiAgICAgIHRyeSB7IHZpZGVvLmN1cnJlbnRUaW1lID0gMDsgfSBjYXRjaCB7IC8qIGRldGFjaGVkIGVsZW1lbnQg4oCUIGlnbm9yZSAqLyB9XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgfVxuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXA6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RTZXREdXJhdGlvbjogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgZHJhZ01vdXNlTW92ZUhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkcmFnTW91c2VVcEhhbmRsZXI6ICgoZTogTW91c2VFdmVudCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyOiAoKGU6IE1vdXNlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHJlbG9hZFZpZGVvRWxlbWVudDogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHByZWxvYWRBbGxWaWRlb0VsZW1lbnQ6IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgXG4gIHNhZmVUcmFjZVVybDogU2FmZVJlc291cmNlVXJsO1xuICB0cmFjZVZpZXdlckxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdHJhY2VWaWV3ZXJFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvcnJlY3REZXZpY2VGcmFtZUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtcHR5U3RhdGVDb25maWcgPSBnZXRFbXB0eVN0YXRlUHJlc2V0KCdub3RoaW5nVG9EaXNwbGF5Jyk7XG4gIHJlYWRvbmx5IGRldmljZUVycm9yRW1wdHlTdGF0ZUNvbmZpZyA9IHtcbiAgICAuLi50aGlzLmVtcHR5U3RhdGVDb25maWcsXG4gICAgdGl0bGU6ICdEZXZpY2UgTm90IFN1cHBvcnRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGV2aWNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSBpcyBub3Qgc3VwcG9ydGVkLicsXG4gICAgYWN0aW9uczogW11cbiAgfTtcblxuICBnZXQgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0KCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgZGVmYXVsdFZpZXdwb3J0ID0geyB3aWR0aDogMTI4MCwgaGVpZ2h0OiA3MjAgfTtcblxuICAgIGlmICghdGhpcy5icm93c2VyVmlld1BvcnQpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0Vmlld3BvcnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSBOdW1iZXIoKHRoaXMuYnJvd3NlclZpZXdQb3J0IGFzIGFueSkud2lkdGgpO1xuICAgIGNvbnN0IGhlaWdodCA9IE51bWJlcigodGhpcy5icm93c2VyVmlld1BvcnQgYXMgYW55KS5oZWlnaHQpO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUod2lkdGgpIHx8ICFOdW1iZXIuaXNGaW5pdGUoaGVpZ2h0KSB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZpZXdwb3J0O1xuICAgIH1cblxuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgTU9CSUxFX0JST1dTRVJfREVWSUNFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnaXBob25lXzExJzogJ2lQaG9uZSAxMScsXG4gICAgJ2lwaG9uZV8xMyc6ICdpUGhvbmUgMTMnLFxuICAgICdpcGhvbmVfMTUnOiAnaVBob25lIDE1JyxcbiAgICAnaXBob25lX3hyJzogJ2lQaG9uZSBYUicsXG4gICAgJ2lwaG9uZV8xNic6ICdpUGhvbmUgMTYnLFxuICAgICdpcGhvbmVfMTZfcHJvJzogJ2lQaG9uZSAxNiBQcm8nLFxuICAgICdpcGhvbmVfMTcnOiAnaVBob25lIDE3JyxcbiAgICAnaXBob25lXzE3X3Byb19tYXgnOiAnaVBob25lIDE3IFBybyBNYXgnLFxuICAgICdwaXhlbF81JzogJ1BpeGVsIDUnLFxuICAgICdwaXhlbF84JzogJ1BpeGVsIDgnLFxuICAgICdwaXhlbF85JzogJ1BpeGVsIDknLFxuICAgICdwaXhlbF8xMCc6ICdQaXhlbCAxMCcsXG4gICAgJ2dhbGF4eV9zMjBfZmUnOiAnR2FsYXh5IFMyMCBGRScsXG4gICAgJ2dhbGF4eV9zMjUnOiAnR2FsYXh5IFMyNScsXG4gICAgJ2dhbGF4eV9zMjVfdWx0cmEnOiAnR2FsYXh5IFMyNSBVbHRyYScsXG4gICAgJ2dhbGF4eV90YWJfYTkrJzogJ0dhbGF4eSBUYWIgQTkrJyxcbiAgfTtcblxuICBwcml2YXRlIHJlc29sdmVNb2JpbGVCcm93c2VyRGV2aWNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5icm93c2VyRGV2aWNlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5icm93c2VyRGV2aWNlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgIHJldHVybiB0aGlzLk1PQklMRV9CUk9XU0VSX0RFVklDRV9NQVBbbm9ybWFsaXplZF0gfHwgbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlRnJhbWVDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBEZXZpY2VGcmFtZUNvbmZpZz4gPSB7XG4gICAgLy8gUGl4ZWxzXG4gICAgJ1BpeGVsIDUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC01LnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNC41JScsXG4gICAgICAgIGJvdHRvbTogJzIlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnUGl4ZWwgOCc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL3BpeGVsLTgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzIlJyxcbiAgICAgICAgcmlnaHQ6ICc0LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMi41JScsXG4gICAgICAgIGxlZnQ6ICc0LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDknOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9waXhlbC05LXByby53ZWJwJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzQlJyxcbiAgICAgICAgcmlnaHQ6ICc1JScsXG4gICAgICAgIGJvdHRvbTogJzQlJyxcbiAgICAgICAgbGVmdDogJzUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ1BpeGVsIDEwJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvcGl4ZWwtMTAucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMSUnLFxuICAgICAgICBsZWZ0OiAnMi41JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc1JSdcbiAgICB9LFxuICAgIC8vIGlQaG9uZXNcbiAgICAnaVBob25lIDExJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTExLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczJScsXG4gICAgICAgIHJpZ2h0OiAnNy41JScsXG4gICAgICAgIGJvdHRvbTogJzMlJyxcbiAgICAgICAgbGVmdDogJzcuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIDEzJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLTEzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnNSUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICc1JSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc0JSdcbiAgICB9LFxuICAgICdpUGhvbmUgMTUnOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9hcHBsZS1pcGhvbmUtMTUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzQuNSUnLFxuICAgICAgICBib3R0b206ICcxLjUlJyxcbiAgICAgICAgbGVmdDogJzQuNSUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnaVBob25lIFhSJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvYXBwbGUtaXBob25lLXhyLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICczLjUlJyxcbiAgICAgICAgcmlnaHQ6ICc3LjUlJyxcbiAgICAgICAgYm90dG9tOiAnMy41JScsXG4gICAgICAgIGxlZnQ6ICc3LjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzQlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNiBQcm8nOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9pcGhvbmUtMTYtcHJvLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcwLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcxLjUlJyxcbiAgICAgICAgYm90dG9tOiAnMC41JScsXG4gICAgICAgIGxlZnQ6ICcxLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNic6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNi5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzMlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzYlJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyBQcm8gTWF4Jzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvaXBob25lLTE3LXByby1tYXgucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzElJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzElJyxcbiAgICAgICAgbGVmdDogJzIlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzglJ1xuICAgIH0sXG4gICAgJ2lQaG9uZSAxNyc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2lwaG9uZS0xNy5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMSUnLFxuICAgICAgICByaWdodDogJzIuNSUnLFxuICAgICAgICBib3R0b206ICcxJScsXG4gICAgICAgIGxlZnQ6ICcyLjUlJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzUlJ1xuICAgIH0sXG4gICAgLy8gR2FsYXh5IFxuICAgICdHYWxheHkgUzIwIEZFJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvc2Ftc3VuZy1nYWxheHktczIwLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcxLjUlJyxcbiAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgIGJvdHRvbTogJzEuNSUnLFxuICAgICAgICBsZWZ0OiAnMiUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNCUnXG4gICAgfSxcbiAgICAnR2FsYXh5IFMyNSc6IHtcbiAgICAgIG1vY2t1cEltYWdlOiAnYXNzZXRzL2ltYWdlcy9tb2NrdXBzL2dhbGF4eS1zMjUucG5nJyxcbiAgICAgIHNjcmVlbkluc2V0OiB7XG4gICAgICAgIHRvcDogJzEuNSUnLFxuICAgICAgICByaWdodDogJzIlJyxcbiAgICAgICAgYm90dG9tOiAnMS41JScsXG4gICAgICAgIGxlZnQ6ICcyJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICc4JSdcbiAgICB9LFxuICAgICdHYWxheHkgUzI1IFVsdHJhJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXMyNS11bHRyYS5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnMC41JScsXG4gICAgICAgIHJpZ2h0OiAnMSUnLFxuICAgICAgICBib3R0b206ICcwLjUlJyxcbiAgICAgICAgbGVmdDogJzElJ1xuICAgICAgfSxcbiAgICAgIGJvcmRlclJhZGl1czogJzMlJ1xuICAgIH0sXG4gICAgJ0dhbGF4eSBUYWIgQTkrJzoge1xuICAgICAgbW9ja3VwSW1hZ2U6ICdhc3NldHMvaW1hZ2VzL21vY2t1cHMvZ2FsYXh5LXRhYi1hOS1wbHVzLnBuZycsXG4gICAgICBzY3JlZW5JbnNldDoge1xuICAgICAgICB0b3A6ICcyJScsXG4gICAgICAgIHJpZ2h0OiAnMyUnLFxuICAgICAgICBib3R0b206ICcyJScsXG4gICAgICAgIGxlZnQ6ICczJSdcbiAgICAgIH0sXG4gICAgICBib3JkZXJSYWRpdXM6ICcxJSdcbiAgICB9LFxuICAgIC8vIEJyb3dzZXJcbiAgICBicm93c2VyOiB7XG4gICAgICBtb2NrdXBJbWFnZTogJ2Fzc2V0cy9pbWFnZXMvbW9ja3Vwcy9icm93c2VyLW1vY2t1cC5wbmcnLFxuICAgICAgc2NyZWVuSW5zZXQ6IHtcbiAgICAgICAgdG9wOiAnNiUnLFxuICAgICAgICByaWdodDogJzAlJyxcbiAgICAgICAgYm90dG9tOiAnMCUnLFxuICAgICAgICBsZWZ0OiAnMCUnXG4gICAgICB9LFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMCUnXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuc2FmZVRyYWNlVXJsID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKCcnKTtcbiAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBkZXZpY2VGcmFtZUNvbmZpZygpOiBEZXZpY2VGcmFtZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmRldmljZU5hbWUgfHwgdGhpcy5yZXNvbHZlTW9iaWxlQnJvd3NlckRldmljZSgpO1xuICAgICAgcmV0dXJuIChuYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdKSA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW25hbWVdIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJykge1xuICAgICAgLy8gQXV0by1kZXRlY3QgbW9iaWxlIGRldmljZSBlbXVsYXRpb24gZnJvbSB0aGUgYnJvd3NlciB2YWx1ZVxuICAgICAgY29uc3QgbW9iaWxlTmFtZSA9IHRoaXMucmVzb2x2ZU1vYmlsZUJyb3dzZXJEZXZpY2UoKTtcbiAgICAgIGlmIChtb2JpbGVOYW1lICYmIHRoaXMuZGV2aWNlRnJhbWVDb25maWdzW21vYmlsZU5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1ttb2JpbGVOYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmRldmljZUZyYW1lQ29uZmlnc1snYnJvd3NlciddIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZGV2aWNlTW9ja3VwSW1hZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VGcmFtZUNvbmZpZyA/IHRoaXMuZGV2aWNlRnJhbWVDb25maWcubW9ja3VwSW1hZ2UgOiAnJztcbiAgfVxuXG4gIGdldCBkZXZpY2VTY3JlZW5TdHlsZSgpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLmRldmljZUZyYW1lQ29uZmlnO1xuICAgIGlmICghY2ZnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiBjZmcuc2NyZWVuSW5zZXQudG9wLFxuICAgICAgcmlnaHQ6IGNmZy5zY3JlZW5JbnNldC5yaWdodCxcbiAgICAgIGJvdHRvbTogY2ZnLnNjcmVlbkluc2V0LmJvdHRvbSxcbiAgICAgIGxlZnQ6IGNmZy5zY3JlZW5JbnNldC5sZWZ0LFxuICAgICAgJ2JvcmRlci1yYWRpdXMnOiBjZmcuYm9yZGVyUmFkaXVzLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5zZWxlY3RlZFZpZXc7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgIHRoaXMudXBkYXRlU2FmZVRyYWNlVXJsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgYWN0aXZlIGxpYnJhcnkgY2FyZCdzIDx2aWRlbz4gZWxlbWVudCdzIHBsYXkgc3RhdGUgaW4gc3luYyB3aXRoIHRoZSBtYWluIHBsYXllclxuICAgIC8vIHNvIHRoZSBjYXJkIGRvZXNuJ3Qgc2hvdyBhIGZyb3plbiB0aHVtYm5haWwgd2hpbGUgdGhlIG1haW4gdmlkZW8gaXMgcGxheWluZy5cbiAgICBjb25zdCBrZXkgPSBgJHt0aGlzLmN1cnJlbnRWaWRlb0luZGV4fToke3RoaXMuaXNQbGF5aW5nfWA7XG4gICAgaWYgKGtleSAhPT0gdGhpcy5sYXN0TGlicmFyeVN5bmNLZXkpIHtcbiAgICAgIHRoaXMubGFzdExpYnJhcnlTeW5jS2V5ID0ga2V5O1xuICAgICAgdGhpcy5zeW5jTGlicmFyeUNsaXBQbGF5YmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0xpYnJhcnlDbGlwUGxheWJhY2soKTogdm9pZCB7XG4gICAgY29uc3QgcmVmcyA9IHRoaXMuY2xpcFZpZGVvcztcbiAgICBpZiAoIXJlZnMpIHJldHVybjtcbiAgICBjb25zdCBtYWluRWwgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgcmVmcy5mb3JFYWNoKChyZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gcmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2hvdWxkUGxheSA9IGkgPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXggJiYgdGhpcy5pc1BsYXlpbmc7XG4gICAgICBpZiAoc2hvdWxkUGxheSkge1xuICAgICAgICAvLyBTZWVkIHRoZSBjYXJkJ3MgY3VycmVudFRpbWUgZnJvbSB0aGUgbWFpbiBwbGF5ZXIgc28gdGhleSBzdGFydCByb3VnaGx5IGFsaWduZWQuXG4gICAgICAgIGlmIChtYWluRWwgJiYgaXNGaW5pdGUobWFpbkVsLmN1cnJlbnRUaW1lKSAmJiAhaXNOYU4obWFpbkVsLmN1cnJlbnRUaW1lKSkge1xuICAgICAgICAgIHRyeSB7IGVsLmN1cnJlbnRUaW1lID0gbWFpbkVsLmN1cnJlbnRUaW1lOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsLnBhdXNlZCkge1xuICAgICAgICAgIGNvbnN0IHAgPSBlbC5wbGF5KCk7XG4gICAgICAgICAgaWYgKHAgJiYgdHlwZW9mIHAuY2F0Y2ggPT09ICdmdW5jdGlvbicpIHAuY2F0Y2goKCkgPT4geyAvKiBhdXRvcGxheSBtYXkgYmUgYmxvY2tlZCDigJQgaWdub3JlICovIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFlbC5wYXVzZWQpIHtcbiAgICAgICAgZWwucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlkZW9VcmxzJ10pIHtcbiAgICAgIGNvbnN0IHByZXYgPSAoY2hhbmdlc1sndmlkZW9VcmxzJ10ucHJldmlvdXNWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjdXJyID0gKGNoYW5nZXNbJ3ZpZGVvVXJscyddLmN1cnJlbnRWYWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICAvLyBNaWQtc2Vzc2lvbiBjYXB0dXJlcyBhcHBlbmQgdG8gdmlkZW9VcmxzLiBUcmVhdCBhcHBlbmQtb25seSBjaGFuZ2VzIGFzXG4gICAgICAvLyBhZGRpdGl2ZSBzbyB0aGUgY3VycmVudGx5LXBsYXlpbmcgY2xpcCBpc24ndCB5YW5rZWQgYmFjayB0byBpbmRleCAwLFxuICAgICAgLy8gYW5kIG1hcmsgdGhlIG5ldyB0YWlsIGNsaXBzIHdpdGggTkVXIGJhZGdlcy5cbiAgICAgIGNvbnN0IGlzQXBwZW5kT25seSA9XG4gICAgICAgIGN1cnIubGVuZ3RoID4gcHJldi5sZW5ndGggJiZcbiAgICAgICAgcHJldi5ldmVyeSgodSwgaSkgPT4gY3VycltpXSA9PT0gdSk7XG5cbiAgICAgIGlmIChjdXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGlzQXBwZW5kT25seSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBwcmV2Lmxlbmd0aDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubmV3VmlkZW9JbmRleGVzLmFkZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgICAvLyBVUkxzIHJlcGxhY2VkIChlLmcuIGV4ZWN1dGlvbl9jb21wbGV0ZWQgc3dhcHBpbmcgY2FwdHVyZWQg4oaSIHNjcmVlbl9yZWNvcmRpbmdzKS5cbiAgICAgICAgICAvLyBEaXNjYXJkIHN0YWxlIGR1cmF0aW9uICsgbGlicmFyeSBjYWNoZXMgc28gdGhlIG5ldyBjbGlwcyBhcmUgcmUtcHJvYmVkLlxuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucyA9IFtdO1xuICAgICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZXRlY3RWaWRlb0R1cmF0aW9ucyhjdXJyKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVByZWxvYWRBbGxTZWdtZW50cyhjdXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSAwO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gW107XG4gICAgICAgIHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydpc0xpdmUnXSAmJiBjaGFuZ2VzWydpc0xpdmUnXS5jdXJyZW50VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAvLyBOZXcgcG9zdC1leGVjdXRpb24gc2Vzc2lvbjogZGVmYXVsdCBiYWNrIHRvICdsaXZlJyBzbyB0aGUgbmV4dCBsaXZlXG4gICAgICAvLyBydW4gc3RhcnRzIHdpdGggdGhlIGxpdmUgdmlldywgbm90IHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsYXN0IG9uLlxuICAgICAgdGhpcy5saXZlU2Vzc2lvblZpZXcgPSAnbGl2ZSc7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXSAmJiAhY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzWydsaXZlU2Vzc2lvblZpZXcnXS5jdXJyZW50VmFsdWU7XG4gICAgICBjb25zdCByZXNvbHZlZDogJ2xpdmUnIHwgJ2NhcHR1cmVkJyA9IChuZXh0ID09PSAnY2FwdHVyZWQnID8gJ2NhcHR1cmVkJyA6ICdsaXZlJyk7XG4gICAgICBjb25zdCBwcmV2ID0gY2hhbmdlc1snbGl2ZVNlc3Npb25WaWV3J10ucHJldmlvdXNWYWx1ZTtcbiAgICAgIHRoaXMubGl2ZVNlc3Npb25WaWV3ID0gcmVzb2x2ZWQ7XG4gICAgICBpZiAocmVzb2x2ZWQgIT09IHByZXYpIHtcbiAgICAgICAgLy8gUGFyZW50IHB1c2hlZCBhIG5ldyB2aWV3IChlLmcuIFwiV2F0Y2ggTm93XCIgb3IgcmVzdW1lLWFjdGlvbiByZXR1cm5pbmcgdG8gTGl2ZSkuXG4gICAgICAgIC8vIFJlc2V0IHRoZSBzaW11bGF0b3IgdGhlIHNhbWUgd2F5IHRoZSBzZWdtZW50IGNvbnRyb2wgd291bGQuXG4gICAgICAgIHRoaXMucmVzZXRMaXZlU2Vzc2lvblBsYXliYWNrU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10gJiYgIWNoYW5nZXNbJ3ZpZGVvQ3VycmVudER1cmF0aW9uJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gY2hhbmdlc1sndmlkZW9DdXJyZW50RHVyYXRpb24nXS5jdXJyZW50VmFsdWU7XG4gICAgICAvLyBJZ25vcmUgc2VudGluZWwgdmFsdWUgKC0xKSB1c2VkIHRvIGZvcmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgIGlmIChuZXdEdXJhdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodGhpcy5pc1BsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uQ2hhbmdlcyB2aWRlb0N1cnJlbnREdXJhdGlvbjogcGF1c2VkIHZpZGVvIGJlZm9yZSBzZWVraW5nJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKG5ld0R1cmF0aW9uKTtcbiAgICAgICAgaWYgKHRhcmdldFZpZGVvSW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgICAgICAgIGNvbnN0IHRhcmdldEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4XTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVRpbWVzdGFtcCA9IG5ld0R1cmF0aW9uIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbmVlZHNTd2l0Y2ggPSB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ICE9PSB0YXJnZXRWaWRlb0luZGV4O1xuICAgICAgICAgIFxuICAgICAgICAgIGlmICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWaWRlb1RpbWVNcyA9IHRoaXMudnBsYXllci5uYXRpdmVFbGVtZW50LmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMocmVsYXRpdmVUaW1lc3RhbXAgLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2ggfHwgbmV3RHVyYXRpb24gIT09IHRoaXMubGFzdFNldER1cmF0aW9uIHx8IHRpbWVEaWZmZXJlbmNlID4gMTAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsobmV3RHVyYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobmVlZHNTd2l0Y2gpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZpZGVvVGltZU1zID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQuY3VycmVudFRpbWUgKiAxMDAwO1xuICAgICAgICAgIGNvbnN0IHRpbWVEaWZmZXJlbmNlID0gTWF0aC5hYnMobmV3RHVyYXRpb24gLSBjdXJyZW50VmlkZW9UaW1lTXMpO1xuICAgICAgICAgIGlmIChuZXdEdXJhdGlvbiAhPT0gdGhpcy5sYXN0U2V0RHVyYXRpb24gfHwgdGltZURpZmZlcmVuY2UgPiAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vla1RvVGltZShuZXdEdXJhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWyd0cmFjZVZpZXdVcmwnXSkge1xuICAgICAgdGhpcy51cGRhdGVTYWZlVHJhY2VVcmwoKTtcbiAgICAgIHRoaXMudXBkYXRlU2VnbWVudHMoKTtcbiAgICAgIGlmICghdGhpcy50cmFjZVZpZXdVcmwgJiYgdGhpcy5jdXJyZW50VmlldyA9PT0gJ3RyYWNlJykge1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3ID0gdGhpcy5oaWRlVmlkZW9UYWIgPyAnc2NyZWVuc2hvdHMnIDogJ3ZpZGVvJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2hpZGVWaWRlb1RhYiddKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNlZ21lbnRzKCk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzZWxlY3RlZFZpZXcnXSkge1xuICAgICAgdGhpcy5jdXJyZW50VmlldyA9IGNoYW5nZXNbJ3NlbGVjdGVkVmlldyddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwKSB7XG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkQWxsVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBuZ09uRGVzdHJveTogY2xlYW5lZCB1cCBsaXN0ZW5lcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWVrIHZpZGVvIC0gcHVibGljIG1ldGhvZCAoZW5xdWV1ZXMgb3BlcmF0aW9uKVxuICAgKi9cbiAgc2Vla1RvVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc2Vla1RvVGltZUludGVybmFsKG1pbGxpc2Vjb25kcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZWsgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICogVGhpcyBwcmV2ZW50cyBwaXBlbGluZSByZWFkIGVycm9ycyBkdXJpbmcgcmFwaWQgc2VlayBvcGVyYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlZWtUb1RpbWVJbnRlcm5hbChtaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8gfHwgIXZpZGVvLmR1cmF0aW9uKSByZXR1cm47XG5cbiAgICBjb25zdCBzZWNvbmRzID0gbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICBjb25zdCB0YXJnZXRUaW1lID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Vjb25kcywgdmlkZW8uZHVyYXRpb24pKTtcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzZWVrVG9UaW1lSW50ZXJuYWw6IHNlZWtpbmcnLCB7XG4gICAgICBtaWxsaXNlY29uZHMsXG4gICAgICB0YXJnZXRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBjdXJyZW50VGltZUJlZm9yZTogdmlkZW8uY3VycmVudFRpbWVcbiAgICB9KTtcbiAgICBcbiAgICAvLyBTZXQgc2Vla2luZyBzdGF0ZVxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc2Vla2luZyc7XG5cbiAgICAvLyBDUklUSUNBTDogUGF1c2UgYmVmb3JlIHNlZWtpbmcgdG8gYXZvaWQgcGlwZWxpbmUgZXJyb3JzXG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBzdGF0ZVxuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgLy8gUGVyZm9ybSBzZWVrXG4gICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgIHRoaXMubGFzdFNldER1cmF0aW9uID0gbWlsbGlzZWNvbmRzO1xuICAgIFxuICAgIC8vIFdhaXQgYnJpZWZseSBmb3Igc2VlayB0byBjb21wbGV0ZSAocHJldmVudHMgcmFwaWQgc2VlayBpc3N1ZXMpXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG5cbiAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAodmlkZW8uY3VycmVudFRpbWUgKiAxMDAwIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyB2aWRlby5jdXJyZW50VGltZSAqIDEwMDApO1xuICAgIFxuICAgIC8vIFNldCB0byBwYXVzZWQgc3RhdGUgKHVzZXIgbXVzdCBleHBsaWNpdGx5IHBsYXkpXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHNlZWtUb1RpbWVJbnRlcm5hbDogc2VlayBjb21wbGV0ZScsIHtcbiAgICAgIGN1cnJlbnRUaW1lQWZ0ZXI6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcbiAgfVxuXG4gIG9uVmlkZW9LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gJyAnICYmIGV2ZW50LmNvZGUgIT09ICdTcGFjZScpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWRlb1VybCkge1xuICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBwbGF5L3BhdXNlIChub3cgdHJpdmlhbCB3aXRoIHN0YXRlIG1hY2hpbmUpXG4gICAqL1xuICB0b2dnbGVQbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlblxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHZhbGlkIHNvdXJjZVxuICAgIGlmICghdGhpcy5jdXJyZW50VmlkZW9VcmwgfHwgdmlkZW8ubmV0d29ya1N0YXRlID09PSBIVE1MTWVkaWFFbGVtZW50Lk5FVFdPUktfTk9fU09VUkNFIHx8IHZpZGVvLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBubyB2YWxpZCBzb3VyY2UnLCB7XG4gICAgICAgIGN1cnJlbnRWaWRlb1VybDogdGhpcy5jdXJyZW50VmlkZW9VcmwsXG4gICAgICAgIG5ldHdvcmtTdGF0ZTogdmlkZW8ubmV0d29ya1N0YXRlLFxuICAgICAgICBlcnJvcjogdmlkZW8uZXJyb3JcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlY292ZXIgZnJvbSBzdHVjayAnbG9hZGluZycgc3RhdGUgd2hlbiB2aWRlbyBpcyBhY3R1YWxseSByZWFkeSAoZS5nLiBhZnRlciBqdW1wLXRvLXNlZ21lbnQpXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyAmJiB2aWRlby5yZWFkeVN0YXRlID49IEhUTUxNZWRpYUVsZW1lbnQuSEFWRV9NRVRBREFUQSkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cblxuICAgIC8vIERvbid0IGFsbG93IHBsYXkgZHVyaW5nIGVycm9yIHN0YXRlXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdlcnJvcicpIHtcbiAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gdG9nZ2xlUGxheTogcGxheWVyIGluIGVycm9yIHN0YXRlJywgeyByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlIH0pO1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdpZGxlJztcbiAgICB9XG5cbiAgICAvLyBJZiBzdGlsbCBsb2FkaW5nIGFuZCB2aWRlbyBub3QgcmVhZHksIHdhaXQgYW5kIHJldHJ5XG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSB0b2dnbGVQbGF5OiBwbGF5ZXIgbm90IHJlYWR5Jywge1xuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHZpZGVvLnJlYWR5U3RhdGUgPj0gSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBICYmIHRoaXMucGxheWVyU3RhdGUgIT09ICdwbGF5aW5nJykge1xuICAgICAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHRvZ2dsZVBsYXk6Jywge1xuICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGUsXG4gICAgICBpc1BsYXlpbmc6IHRoaXMuaXNQbGF5aW5nLFxuICAgICAgcmVhZHlTdGF0ZTogdmlkZW8ucmVhZHlTdGF0ZVxuICAgIH0pO1xuXG4gICAgLy8gU2ltcGxlIHRvZ2dsZSBiYXNlZCBvbiBzdGF0ZVxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIHRoaXMucGF1c2VWaWRlbygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgIH1cbiAgfVxuXG4gIC8vICBTSE9XIFBMQVkgUEFVU0UgT1ZFUkxBWVxuICBvblZpZGVvRnJhbWVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVBsYXkoKTtcbiAgICB0aGlzLnNob3dQbGF5UGF1c2VPdmVybGF5ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnBsYXlQYXVzZU92ZXJsYXlUaW1lcik7XG4gICAgdGhpcy5wbGF5UGF1c2VPdmVybGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2hvd1BsYXlQYXVzZU92ZXJsYXkgPSBmYWxzZTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgdmlkZW8gLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHBsYXlWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQbGF5IHZpZGVvIGludGVybmFsIGltcGxlbWVudGF0aW9uIChubyBlbnF1ZXVlIC0gY2FsbGVkIGZyb20gcXVldWUpXG4gICAqIFRoaXMgZWxpbWluYXRlcyBGRm1wZWdEZW11eGVyIGVycm9ycyBhbmQgcGxheSBwcm9taXNlIGludGVycnVwdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGxheVZpZGVvSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykge1xuICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBwbGF5aW5nIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZycpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwbGF5aW5nLCBza2lwcGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogc3RhcnRpbmcnLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGN1cnJlbnRUaW1lOiB2aWRlby5jdXJyZW50VGltZSxcbiAgICAgIHJlYWR5U3RhdGU6IHZpZGVvLnJlYWR5U3RhdGVcbiAgICB9KTtcblxuICAgIC8vIFdhaXQgZm9yIHZpZGVvIHRvIGJlIHJlYWR5IGlmIG5lZWRlZFxuICAgIGlmICh2aWRlby5yZWFkeVN0YXRlIDwgSFRNTE1lZGlhRWxlbWVudC5IQVZFX01FVEFEQVRBKSB7XG4gICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHdhaXRpbmcgZm9yIG1ldGFkYXRhJyk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9uTG9hZGVkTWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhKTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgdmlkZW8gbWV0YWRhdGEnKSk7XG4gICAgICAgIH07XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFyIGhpdCBtYXJrZXJzIGlmIHN0YXJ0aW5nIGZyb20gYmVnaW5uaW5nXG4gICAgY29uc3QgY3VycmVudFRpbWVNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcbiAgICBpZiAoY3VycmVudFRpbWVNcyA8IDEwMCkge1xuICAgICAgdGhpcy5oaXRNYXJrZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHN0YXRlIHRvIGxvYWRpbmdcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBiZWZvcmUgcGxheWluZ1xuICAgICAgY29uc3QgY3VycmVudFZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFjdXJyZW50VmlkZW8gfHwgY3VycmVudFZpZGVvICE9PSB2aWRlbykge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiB2aWRlbyBlbGVtZW50IGNoYW5nZWQgb3IgdW5hdmFpbGFibGUnKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBd2FpdCBwbGF5IHByb21pc2UgLSB0aGlzIGlzIGNyaXRpY2FsXG4gICAgICBhd2FpdCB2aWRlby5wbGF5KCk7XG4gICAgICBcbiAgICAgIC8vIFZlcmlmeSB2aWRlbyBlbGVtZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhZnRlciBwbGF5IHByb21pc2UgcmVzb2x2ZXNcbiAgICAgIGNvbnN0IHZpZGVvQWZ0ZXJQbGF5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlb0FmdGVyUGxheSB8fCB2aWRlb0FmdGVyUGxheSAhPT0gdmlkZW8pIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogdmlkZW8gZWxlbWVudCBjaGFuZ2VkIGR1cmluZyBwbGF5Jyk7XG4gICAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGF1c2VkJztcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGxheSBzdWNjZWVkZWRcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAncGxheWluZyc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QbGF5LmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIFxuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBwbGF5aW5nIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lLFxuICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzUGxheWluZyAmJiB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB2ID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy5jaGVja01hcmtlckhpdChzZWdtZW50U3RhcnQgKyB2LmN1cnJlbnRUaW1lICogMTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDUwKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgLy8gUGxheSBmYWlsZWRcbiAgICAgIC8vIENoZWNrIGlmIHZpZGVvIGVsZW1lbnQgaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgICBjb25zdCB2aWRlb0FmdGVyRXJyb3IgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZGVvQWZ0ZXJFcnJvciB8fCB2aWRlb0FmdGVyRXJyb3IgIT09IHZpZGVvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW1NpbXVsYXRvcl0gcGxheVZpZGVvSW50ZXJuYWw6IHZpZGVvIGVsZW1lbnQgY2hhbmdlZCBkdXJpbmcgZXJyb3InKTtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdlcnJvcic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICBcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBwbGF5VmlkZW9JbnRlcm5hbDogYWJvcnRlZCAoZXhwZWN0ZWQgZHVyaW5nIHBhdXNlKScpO1xuICAgICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkLCByZXNldCB0byBwYXVzZWQgc3RhdGUgaW5zdGVhZCBvZiBlcnJvclxuICAgICAgICBpZiAodmlkZW9BZnRlckVycm9yICYmIHZpZGVvQWZ0ZXJFcnJvciA9PT0gdmlkZW8pIHtcbiAgICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHBsYXlWaWRlb0ludGVybmFsOiBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSB2aWRlbyAtIHB1YmxpYyBtZXRob2QgKGVucXVldWVzIG9wZXJhdGlvbilcbiAgICovXG4gIHByaXZhdGUgcGF1c2VWaWRlbygpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5wYXVzZVZpZGVvSW50ZXJuYWwoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdmlkZW8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKG5vIGVucXVldWUgLSBjYWxsZWQgZnJvbSBxdWV1ZSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGF1c2VWaWRlb0ludGVybmFsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIC8vIEFscmVhZHkgcGF1c2VkIC0gc2tpcFxuICAgIGlmICh0aGlzLnBsYXllclN0YXRlID09PSAncGF1c2VkJykge1xuICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogYWxyZWFkeSBwYXVzZWQsIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2luZycsIHtcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgY3VycmVudFRpbWU6IHZpZGVvLmN1cnJlbnRUaW1lXG4gICAgfSk7XG5cbiAgICAgIHZpZGVvLnBhdXNlKCk7XG4gICAgXG4gICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLnZpZGVvUGF1c2UuZW1pdCgpO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHBhdXNlVmlkZW9JbnRlcm5hbDogcGF1c2VkIHN1Y2Nlc3NmdWxseScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWUgbWVkaWEgb3BlcmF0aW9uIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqIFRoaXMgaXMgdGhlIENSSVRJQ0FMIGZpeCBmb3IgRkZtcGVnRGVtdXhlciBlcnJvcnMgYW5kIHBsYXkgcHJvbWlzZSBpbnRlcnJ1cHRpb25zXG4gICAqIEFsbCBtZWRpYSBvcGVyYXRpb25zIChwbGF5LCBwYXVzZSwgc2Vlaywgc3dpdGNoKSBnbyB0aHJvdWdoIHRoaXMgcXVldWVcbiAgICovXG4gIHByaXZhdGUgZW5xdWV1ZU9wZXJhdGlvbihvcGVyYXRpb246ICgpID0+IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gdGhpcy5vcGVyYXRpb25RdWV1ZVxuICAgICAgLnRoZW4oKCkgPT4gb3BlcmF0aW9uKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gTWVkaWEgb3BlcmF0aW9uIGZhaWxlZDonLCBlcnIpO1xuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2Vycm9yJztcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGhhc011bHRpcGxlVmlkZW9zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAxO1xuICB9XG5cbiAgLyoqIEN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBbbXNdLiBzZWdtZW50Qm91bmRhcmllc1tpXSA9IHN1bSBvZiBkdXJhdGlvbnMgWzAuLmldICovXG4gIGdldCBzZWdtZW50Qm91bmRhcmllcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZHVyYXRpb25zID0gdGhpcy52aWRlb0R1cmF0aW9ucztcbiAgICBpZiAoZHVyYXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kYXJpZXM6IG51bWJlcltdID0gW107XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChjb25zdCBkIG9mIGR1cmF0aW9ucykge1xuICAgICAgc3VtICs9IGQ7XG4gICAgICBib3VuZGFyaWVzLnB1c2goc3VtKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kYXJpZXM7XG4gIH1cblxuICAvKiogVG90YWwgZHVyYXRpb24gYWNyb3NzIGFsbCBzZWdtZW50cyBpbiBtcyAqL1xuICBnZXQgdG90YWxEdXJhdGlvbigpOiBudW1iZXIge1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMudmlkZW9EdXJhdGlvbnM7XG4gICAgaWYgKGR1cmF0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgIHJldHVybiBkdXJhdGlvbnMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gIH1cblxuICAvKiogVmlkZW8gZHVyYXRpb25zIGluIG1zIChkZXRlY3RlZCBvciBmcm9tIHNpbmdsZSB2aWRlbyBlbGVtZW50KS5cbiAgICpcbiAgICogIE1lcmdlcyB0d28gaW5kZXBlbmRlbnQgcHJvYmVzOiBgZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc2AgKG9mZi1ET00gdGVtcCB2aWRlb3MpXG4gICAqICBhbmQgYGxpYnJhcnlWaWRlb0R1cmF0aW9uc2AgKHRoZSByZW5kZXJlZCBsaWJyYXJ5IHRodW1ibmFpbHMpLiBFaXRoZXIgY2FuXG4gICAqICByZXNvbHZlIGZpcnN0IGRlcGVuZGluZyBvbiBicm93c2VyIHF1aXJrcyB3aXRoIFdlYk0vSW5maW5pdHktZHVyYXRpb24gY2xpcHM7XG4gICAqICB3ZSB0YWtlIHRoZSBmaXJzdCBmaW5pdGUgdmFsdWUgcGVyIGluZGV4LiAqL1xuICBwcml2YXRlIGdldCB2aWRlb0R1cmF0aW9ucygpOiBudW1iZXJbXSB7XG4gICAgaWYgKHRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnZpZGVvVXJscyB8fCBbXTtcbiAgICAgIGlmICh1cmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgY29uc3QgbWVyZ2VkOiBudW1iZXJbXSA9IG5ldyBBcnJheSh1cmxzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZGV0ZWN0ZWQgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGRldGVjdGVkKSAmJiBkZXRlY3RlZCA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBkZXRlY3RlZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmcm9tTGlicmFyeVMgPSB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5nZXQoaSk7XG4gICAgICAgIGlmICh0eXBlb2YgZnJvbUxpYnJhcnlTID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShmcm9tTGlicmFyeVMpICYmIGZyb21MaWJyYXJ5UyA+IDApIHtcbiAgICAgICAgICBtZXJnZWRbaV0gPSBmcm9tTGlicmFyeVMgKiAxMDAwO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVua25vd24geWV0IOKAlCBsZWF2ZSB0aGUgc2xvdCBhcyBhIGhvbGUgc28gY2FsbGVycyBjYW4gZGV0ZWN0IHBhcnRpYWwgc3RhdGUuXG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodmlkZW8/LmR1cmF0aW9uICYmIGlzRmluaXRlKHZpZGVvLmR1cmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFt2aWRlby5kdXJhdGlvbiAqIDEwMDBdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgY3VycmVudFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIGxldCBtYXJrZXJzVG9Qcm9jZXNzOiBTdGVwTWFya2VyW107XG4gICAgXG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICBtYXJrZXJzVG9Qcm9jZXNzID0gdGhpcy5zdGVwTWFya2VycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmN1cnJlbnRWaWRlb0luZGV4ID49IGJvdW5kYXJpZXMubGVuZ3RoKSB7XG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY3VycmVudEJvdW5kYXJ5ID0gYm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4XTtcbiAgICAgICAgXG4gICAgICAgIG1hcmtlcnNUb1Byb2Nlc3MgPSB0aGlzLnN0ZXBNYXJrZXJzXG4gICAgICAgICAgLmZpbHRlcihtYXJrZXIgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPj0gY3VycmVudEJvdW5kYXJ5LnN0YXJ0ICYmIFxuICAgICAgICAgICAgICAgICAgIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24gPCBjdXJyZW50Qm91bmRhcnkuZW5kO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLm1hcChtYXJrZXIgPT4gdGhpcy5hZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24oXG4gICAgICAgICAgICBtYXJrZXIsIFxuICAgICAgICAgICAgY3VycmVudEJvdW5kYXJ5LnN0YXJ0LCBcbiAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyeS5zdGFydCwgXG4gICAgICAgICAgICBjdXJyZW50Qm91bmRhcnkuZW5kXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKG1hcmtlcnNUb1Byb2Nlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RDaGlsZFN0ZXBzRHVyYXRpb24obWFya2VyOiBTdGVwTWFya2VyLCBhZGp1c3RtZW50OiBudW1iZXIsIHZpZGVvU3RhcnQ6IG51bWJlciwgdmlkZW9FbmQ6IG51bWJlcik6IFN0ZXBNYXJrZXIge1xuICAgIGNvbnN0IGFkanVzdGVkTWFya2VyOiBTdGVwTWFya2VyID0ge1xuICAgICAgLi4ubWFya2VyLFxuICAgICAgY3VtdWxhdGl2ZUR1cmF0aW9uOiBtYXJrZXIuY3VtdWxhdGl2ZUR1cmF0aW9uIC0gYWRqdXN0bWVudFxuICAgIH07XG4gICAgXG4gICAgaWYgKG1hcmtlci5jaGlsZFN0ZXBzICYmIG1hcmtlci5jaGlsZFN0ZXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFkanVzdGVkTWFya2VyLmNoaWxkU3RlcHMgPSBtYXJrZXIuY2hpbGRTdGVwc1xuICAgICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBjb25zdCBhZGp1c3RlZENoaWxkOiBTdGVwTWFya2VyID0ge1xuICAgICAgICAgICAgLi4uY2hpbGQsXG4gICAgICAgICAgICBjdW11bGF0aXZlRHVyYXRpb246IGNoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiAtIGFkanVzdG1lbnRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChjaGlsZC5jaGlsZFN0ZXBzICYmIGNoaWxkLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWRqdXN0ZWRDaGlsZC5jaGlsZFN0ZXBzID0gY2hpbGQuY2hpbGRTdGVwc1xuICAgICAgICAgICAgICAuZmlsdGVyKG5lc3RlZENoaWxkID0+IG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA+PSB2aWRlb1N0YXJ0ICYmIG5lc3RlZENoaWxkLmN1bXVsYXRpdmVEdXJhdGlvbiA8IHZpZGVvRW5kKVxuICAgICAgICAgICAgICAubWFwKG5lc3RlZENoaWxkID0+IHRoaXMuYWRqdXN0Q2hpbGRTdGVwc0R1cmF0aW9uKG5lc3RlZENoaWxkLCBhZGp1c3RtZW50LCB2aWRlb1N0YXJ0LCB2aWRlb0VuZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRDaGlsZDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZGp1c3RlZE1hcmtlcjtcbiAgfVxuXG4gIGdldFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbz8uZHVyYXRpb24pIHJldHVybiAwO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgcmV0dXJuIChzdGVwLmN1bXVsYXRpdmVEdXJhdGlvbiAvIGR1cmF0aW9uTXMpICogMTAwO1xuICB9XG5cbiAgLyoqIEZ1bGwtdmlkZW8gbWFya2VyczogZXZlcnkgbWFya2VyLCBmbGF0dGVuZWQsIGxhaWQgb3V0IG9uIHRoZSBnbG9iYWwgdGltZWxpbmUuXG4gICAqIGBzdGVwTWFya2Vyc2AgaXMgYWxyZWFkeSBpbiBnbG9iYWwgY29vcmRpbmF0ZXMg4oCUIGBjdXJyZW50VmlkZW9NYXJrZXJzYCBkb2VzIHRoZVxuICAgKiBpbnZlcnNlIChmaWx0ZXJzICsgYWRqdXN0cyBwZXItY2xpcCk7IGhlcmUgd2UganVzdCBmbGF0dGVuIHRoZSBvcmlnaW5hbCBsaXN0LiAqL1xuICBnZXQgZnVsbFZpZGVvTWFya2VycygpOiBTdGVwTWFya2VyW10ge1xuICAgIHJldHVybiB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMgfHwgW10pO1xuICB9XG5cbiAgZ2V0R2xvYmFsRnVsbFN0ZXBMZWZ0UG9zaXRpb24oc3RlcDogU3RlcE1hcmtlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHN0ZXAuY3VtdWxhdGl2ZUR1cmF0aW9uIC8gdG90YWwpICogMTAwKSk7XG4gIH1cblxuICAvKiogQ3VtdWxhdGl2ZSBlbGFwc2VkIG1zIG9uIHRoZSBnbG9iYWwgdGltZWxpbmUgKHByaW9yIGNsaXAgZHVyYXRpb25zICsgY3VycmVudCBsb2NhbCB0aW1lKS4gKi9cbiAgZ2V0IGdsb2JhbEN1cnJlbnRUaW1lTXMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBsb2NhbCA9ICh0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lID8/IDApICogMTAwMDtcbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5zZWdtZW50Qm91bmRhcmllcztcbiAgICBjb25zdCBwcmlvckVuZCA9IHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwID8gKGJvdW5kYXJpZXNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCAtIDFdID8/IDApIDogMDtcbiAgICByZXR1cm4gcHJpb3JFbmQgKyBsb2NhbDtcbiAgfVxuXG4gIC8qKiAwLTEwMCBwb3NpdGlvbiBvbiB0aGUgZ2xvYmFsIHRpbWVsaW5lLCBkcml2ZW4gYnkgdGltZXVwZGF0ZS4gKi9cbiAgZ2V0IGdsb2JhbFByb2dyZXNzKCk6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgaWYgKCF0b3RhbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgKHRoaXMuZ2xvYmFsQ3VycmVudFRpbWVNcyAvIHRvdGFsKSAqIDEwMCkpO1xuICB9XG5cbiAgLyoqIFdoaWxlIGRyYWdnaW5nIGluIGZ1bGwgbW9kZSwgdGhlIHNjcnViYmVyIHJlYWRzIHRoZSBvdmVycmlkZTsgb3RoZXJ3aXNlIGdsb2JhbFByb2dyZXNzLiAqL1xuICBnZXQgZ2xvYmFsU2NydWJiZXJQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZ2dpbmcgPyB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA6IHRoaXMuZ2xvYmFsUHJvZ3Jlc3M7XG4gIH1cblxuICBnZXRTdGVwQ29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0ZXAubGV2ZWwgPT09IDEgPyAnIzAwMDAwMCcgOiAnIzYzNjZGMSc7XG4gIH1cblxuICBnZXRTdGVwUmVzdWx0Q29sb3Ioc3RlcDogU3RlcE1hcmtlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3Ioc3RlcC5yZXN1bHQpO1xuICB9XG5cbiAgZ2V0R2xvYmFsTWFya2VyQ29sb3IobGV2ZWw/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBsZXZlbCA9PT0gMSA/ICcjMDAwMDAwJyA6ICcjRkZBNTAwJztcbiAgfVxuXG4gIGdldEdsb2JhbE1hcmtlclJlc3VsdENvbG9yKHJlc3VsdDogU3RlcE1hcmtlclsncmVzdWx0J10pOiBzdHJpbmcge1xuICAgIHN3aXRjaCAocmVzdWx0KSB7XG4gICAgICBjYXNlICdTVUNDRVNTJzpcbiAgICAgICAgcmV0dXJuICcjMTJCNzZBJztcbiAgICAgIGNhc2UgJ0ZBSUxVUkUnOlxuICAgICAgICByZXR1cm4gJyNCOTFDMUMnO1xuICAgICAgY2FzZSAnQUJPUlRFRCc6XG4gICAgICAgIHJldHVybiAnI0Y3OTAwOSc7XG4gICAgICBjYXNlICdTS0lQUEVEJzpcbiAgICAgICAgcmV0dXJuICcjNjY3MDg1JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnIzYzNjZGMSc7XG4gICAgfVxuICB9XG5cbiAgb25NYXJrZXJDbGljayhldmVudDogTW91c2VFdmVudCwgbWFya2VyOiBTdGVwTWFya2VyKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvPy5kdXJhdGlvbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldFRpbWVNcyA9IG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb247XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKHRhcmdldFRpbWVNcyk7XG4gICAgICBpZiAobWFya2VyLnRlc3RTdGVwSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRWaWRlb1VybCgpOiBzdHJpbmcge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSAmJiB0aGlzLnZpZGVvVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpZHggPSBNYXRoLm1pbihNYXRoLm1heCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4LCAwKSwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4gdGhpcy52aWRlb1VybHNbaWR4XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlkZW9Vcmw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdmlkZW8gc3RhdGUgLSBwdWJsaWMgbWV0aG9kIChlbnF1ZXVlcyBvcGVyYXRpb24pXG4gICAqL1xuICBwcml2YXRlIHJlc2V0VmlkZW9TdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5yZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB2aWRlbyBzdGF0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiAobm8gZW5xdWV1ZSAtIGNhbGxlZCBmcm9tIHF1ZXVlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNldFZpZGVvU3RhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IHJlc2V0dGluZycpO1xuXG4gICAgdmlkZW8ucGF1c2UoKTtcbiAgICB2aWRlby5jdXJyZW50VGltZSA9IDA7XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhc3RTZXREdXJhdGlvbiA9IC0xO1xuICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gcmVzZXRWaWRlb1N0YXRlSW50ZXJuYWw6IGNvbXBsZXRlJyk7XG4gIH1cblxuICBwcmV2VmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSByZXR1cm47XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPiAwKSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oKCkgPT4gdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMSkpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHJldHVybjtcbiAgICBpZiAodGhpcy52aWRlb1VybHMgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA8IHRoaXMudmlkZW9VcmxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbigoKSA9PiB0aGlzLnN3aXRjaFRvVmlkZW9BbmRSZXNldEludGVybmFsKHRoaXMuY3VycmVudFZpZGVvSW5kZXggKyAxKSk7XG4gICAgfVxuICB9XG5cbiAgb25UaW1lbGluZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNsaWNrWCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XG4gICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGNsaWNrWCAvIHJlY3Qud2lkdGgpKTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCBzaG91bGRSZXN1bWVQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9IHBlcmNlbnQgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTIwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSBwZXJjZW50ICogdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLmlzUGxheWluZztcblxuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblRpbWVsaW5lQ2xpY2snLCB7XG4gICAgICBwZXJjZW50LFxuICAgICAgdGFyZ2V0VGltZU1zLFxuICAgICAgc2hvdWxkUmVzdW1lUGxheWluZ1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnNlZWtUb1RpbWVJbnRlcm5hbCh0YXJnZXRUaW1lTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGFydERyYWcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMOiBDYXB0dXJlIHBsYXlpbmcgc3RhdGUgQkVGT1JFIHBhdXNpbmdcbiAgICAvLyBVc2UgYm90aCBpc1BsYXlpbmcgZmxhZyBhbmQgcGxheWVyU3RhdGUgZm9yIHJlbGlhYmlsaXR5XG4gICAgdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyA9IHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJztcbiAgICBcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gc3RhcnREcmFnJywge1xuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlLFxuICAgICAgaXNQbGF5aW5nOiB0aGlzLmlzUGxheWluZyxcbiAgICAgIHdhc1BsYXlpbmdCZWZvcmVEcmFnOiB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gZHVyaW5nIGRyYWcgdG8gYXZvaWQgY29uZmxpY3RzXG4gICAgaWYgKHRoaXMuaXNQbGF5aW5nIHx8IHRoaXMucGxheWVyU3RhdGUgPT09ICdwbGF5aW5nJykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuYWRkRHJhZ0xpc3RlbmVycygpO1xuICB9XG5cbiAgb25EcmFnKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nIHx8ICF0aGlzLnRpbWVsaW5lQmFyPy5uYXRpdmVFbGVtZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy50aW1lbGluZUJhci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHBlcmNlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih4IC8gcmVjdC53aWR0aCwgMSkpO1xuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSBwZXJjZW50ICogMTAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2dyZXNzID0gcGVyY2VudCAqIDEwMDsgLy8gUGVyLWNsaXAgdGltZWxpbmUgcG9zaXRpb25cbiAgICB9XG4gIH1cblxuICBzdG9wRHJhZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcnMoKTtcblxuICAgIGNvbnN0IHNob3VsZFJlc3VtZVBsYXlpbmcgPSB0aGlzLndhc1BsYXlpbmdCZWZvcmVEcmFnO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiBkcmFnIGVuZGVkJywge1xuICAgICAgcHJvZ3Jlc3M6IHRoaXMucHJvZ3Jlc3MsXG4gICAgICB3YXNQbGF5aW5nQmVmb3JlRHJhZzogdGhpcy53YXNQbGF5aW5nQmVmb3JlRHJhZyxcbiAgICAgIHNob3VsZFJlc3VtZVBsYXlpbmc6IHNob3VsZFJlc3VtZVBsYXlpbmcsXG4gICAgICBjdXJyZW50UGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzVmlkZW9GdWxsTW9kZSkge1xuICAgICAgY29uc3QgdG90YWwgPSB0aGlzLnRvdGFsRHVyYXRpb247XG4gICAgICBpZiAoIXRvdGFsKSByZXR1cm47XG4gICAgICBjb25zdCB0YXJnZXRHbG9iYWxNcyA9ICh0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyAvIDEwMCkgKiB0b3RhbDtcbiAgICAgIHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWsodGFyZ2V0R2xvYmFsTXMpO1xuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF2aWRlby5kdXJhdGlvbiB8fCAhaXNGaW5pdGUodmlkZW8uZHVyYXRpb24pKSByZXR1cm47XG5cbiAgICBjb25zdCB0YXJnZXRUaW1lTXMgPSAodGhpcy5wcm9ncmVzcyAvIDEwMCkgKiB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG5cbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwodGFyZ2V0VGltZU1zKTtcbiAgICAgIFxuICAgICAgaWYgKHNob3VsZFJlc3VtZVBsYXlpbmcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiByZXN1bWluZyBwbGF5YmFjayBhZnRlciBzZWVrJywge1xuICAgICAgICAgIHRhcmdldFRpbWVNcyxcbiAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIFdhaXQgYSBiaXQgbG9uZ2VyIHRvIGVuc3VyZSBzZWVrIGlzIGZ1bGx5IGNvbXBsZXRlXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxNTApKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzdGF0ZSBpcyAncGF1c2VkJyBhZnRlciBzZWVrIChzZWVrVG9UaW1lSW50ZXJuYWwgc2V0cyBpdCB0byAncGF1c2VkJylcbiAgICAgICAgLy8gSWYgc3RhdGUgaXMgc3RpbGwgJ3NlZWtpbmcnLCB3YWl0IGEgYml0IG1vcmVcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdzZWVraW5nJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogc2VlayBzdGlsbCBpbiBwcm9ncmVzcywgd2FpdGluZyBtb3JlJyk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3cgcmVzdW1lIHBsYXliYWNrIChzdGF0ZSBzaG91bGQgYmUgJ3BhdXNlZCcgYXQgdGhpcyBwb2ludClcbiAgICAgICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogcGxheWJhY2sgcmVzdW1lZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5pc1BsYXlpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN0b3BEcmFnOiB1bmV4cGVjdGVkIHN0YXRlIGFmdGVyIHNlZWssIGF0dGVtcHRpbmcgdG8gcmVzdW1lIGFueXdheScsIHtcbiAgICAgICAgICAgIHBsYXllclN0YXRlOiB0aGlzLnBsYXllclN0YXRlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gVHJ5IHRvIHJlc3VtZSBhbnl3YXkgLSBiZXR0ZXIgdG8gdHJ5IHRoYW4gdG8gbGVhdmUgaXQgc3R1Y2tcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBzdG9wRHJhZzogdmlkZW8gd2FzIHBhdXNlZCwgbm90IHJlc3VtaW5nJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyYWdMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG5cbiAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMub25EcmFnKGUpO1xuICAgIH07XG5cbiAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9ICgpID0+IHtcbiAgICAgIHRoaXMuc3RvcERyYWcoKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuZHJhZ01vdXNlVXBIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRHJhZ0xpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnTW91c2VNb3ZlSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZU1vdmVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kcmFnTW91c2VVcEhhbmRsZXIpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlcik7XG4gICAgICB0aGlzLmRyYWdNb3VzZVVwSGFuZGxlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25WaWRlb01ldGFkYXRhTG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvTWV0YWRhdGFMb2FkZWQnKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICB9XG4gIFxuICBvblZpZGVvQ2FuUGxheSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gb25WaWRlb0NhblBsYXknKTtcbiAgICAvLyBFbnN1cmUgcGxheWJhY2sgc3BlZWQgaXMgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHZpZGVvc1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuXG4gICAgLy8gQ29uc3VtZSBhbnkgcGVuZGluZyByZWNvdmVyeSBzdGF0ZSBxdWV1ZWQgYnkgb25WaWRlb0Vycm9yKCk6IHNlZWsgYmFjayB0b1xuICAgIC8vIHdoZXJlIHBsYXliYWNrIGVycm9yZWQgYW5kIGF1dG8tcmVzdW1lIGlmIHdlIHdlcmUgcGxheWluZyBhdCB0aGUgdGltZS5cbiAgICBpZiAodGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlZWtTZWMgPSB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWM7XG4gICAgICBjb25zdCBzaG91bGRQbGF5ID0gdGhpcy5wZW5kaW5nUmVjb3ZlcnlQbGF5O1xuICAgICAgdGhpcy5wZW5kaW5nUmVjb3ZlcnlTZWVrU2VjID0gbnVsbDtcbiAgICAgIHRoaXMucGVuZGluZ1JlY292ZXJ5UGxheSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh2aWRlbyAmJiBpc0Zpbml0ZSh2aWRlby5kdXJhdGlvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHNlZWtTZWMsIHZpZGVvLmR1cmF0aW9uKSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHsgLyogZWxlbWVudCBtYXkgbm90IGJlIHNlZWthYmxlIHlldDsgaGFybWxlc3MgKi8gfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFBsYXkpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgODApKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBOYXRpdmUgZXJyb3ItZXZlbnQgaGFuZGxlciBmb3IgdGhlIG1haW4gPHZpZGVvPiBlbGVtZW50LiBUaGUgQ2hyb21lIG1lZGlhXG4gICAqIHN0YWNrIG9jY2FzaW9uYWxseSB0aHJvd3MgXCJQaXBlbGluZVN0YXR1czo6UElQRUxJTkVfRVJST1JfUkVBRDogRkZtcGVnRGVtdXhlcjpcbiAgICogZGF0YSBzb3VyY2UgZXJyb3JcIiBkdXJpbmcgcGxheWJhY2sgYWZ0ZXIgYSBicmllZiBuZXR3b3JrIGJsaXAgb3IgYSBidXJzdCBvZlxuICAgKiBmYXN0IHVzZXIgYWN0aW9uczsgb25jZSB0aGF0IGhhcHBlbnMgdGhlIGVsZW1lbnQgYmVjb21lcyB1bnJlc3BvbnNpdmUgdG9cbiAgICogcGxheS9wYXVzZS9zZWVrLiBXZSByZWNvdmVyIGJ5IHVubW91bnRpbmcrcmVtb3VudGluZyB0aGUgPHZpZGVvPiB2aWEgKm5nSWZcbiAgICog4oCUIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGF0IG1ha2VzIHRoZSBTY3JlZW5zaG90c+KGlFZpZGVvIHRhYi1zd2l0Y2ggd29ya2Fyb3VuZFxuICAgKiB3b3JrIHRvZGF5IOKAlCB0aGVuIHJlc3RvcmUgdGhlIHByZS1lcnJvciBwbGF5aGVhZCBhbmQgcmVzdW1lIHBsYXliYWNrLiAqL1xuICBvblZpZGVvRXJyb3IoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW8gPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgZXJyID0gdmlkZW8/LmVycm9yO1xuXG4gICAgY29uc29sZS5lcnJvcignW1NpbXVsYXRvcl0gb25WaWRlb0Vycm9yIOKAlCB0cmlnZ2VyaW5nIGF1dG8tcmVjb3ZlcnknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGVycm9yQ29kZTogZXJyPy5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnI/Lm1lc3NhZ2UsXG4gICAgICBuZXR3b3JrU3RhdGU6IHZpZGVvPy5uZXR3b3JrU3RhdGUsXG4gICAgICByZWFkeVN0YXRlOiB2aWRlbz8ucmVhZHlTdGF0ZSxcbiAgICAgIGN1cnJlbnRWaWRlb0luZGV4OiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4LFxuICAgICAgY3VycmVudFZpZGVvVXJsOiB0aGlzLmN1cnJlbnRWaWRlb1VybCxcbiAgICAgIGF0dGVtcHRzOiB0aGlzLnJlY292ZXJ5QXR0ZW1wdHNcbiAgICB9KTtcblxuICAgIC8vIEJvdW5kIHRoZSByZXRyeSBidWRnZXQgdG8gYSByb2xsaW5nIHdpbmRvdyBzbyBhIHBlcnNpc3RlbnRseSBicm9rZW5cbiAgICAvLyBzb3VyY2UgKDQwNCwgdW5zdXBwb3J0ZWQgY29kZWMsIOKApikgZG9lc24ndCBmbGFwIGZvcmV2ZXIuXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBpZiAobm93IC0gdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA+IHRoaXMuUkVDT1ZFUllfV0lORE9XX01TKSB7XG4gICAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IG5vdztcbiAgICB9XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRzKys7XG4gICAgaWYgKHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA+IHRoaXMuTUFYX1JFQ09WRVJZX0FUVEVNUFRTKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBvblZpZGVvRXJyb3I6IGV4Y2VlZGVkIHJlY292ZXJ5IGF0dGVtcHRzLCBnaXZpbmcgdXAnKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FwdHVyZSB3aGF0IHdlIG5lZWQgdG8gcmVzdG9yZSBhZnRlciB0aGUgcmVtb3VudC5cbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVNlZWtTZWMgPSAodmlkZW8gJiYgaXNGaW5pdGUodmlkZW8uY3VycmVudFRpbWUpKSA/IHZpZGVvLmN1cnJlbnRUaW1lIDogMDtcbiAgICB0aGlzLnBlbmRpbmdSZWNvdmVyeVBsYXkgPSB0aGlzLmlzUGxheWluZztcblxuICAgIC8vIFB1dCB0aGUgc3RhdGUgbWFjaGluZSBpbnRvICdlcnJvcicgc28gb25WaWRlb0VsZW1lbnRSZWFkeSByZXNldHMgaXRcbiAgICAvLyBiYWNrIHRvICdpZGxlJyB3aGVuIHRoZSByZW1vdW50ZWQgZWxlbWVudCBhcnJpdmVzLlxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnZXJyb3InO1xuICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5pc1ZpZGVvUGxheWluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcblxuICAgIC8vIFVubW91bnQg4oaSIHJlbW91bnQuIEJyaWVmIDEwMG1zIGdhcCBtaXJyb3JzIHRoZSB0YWItc3dpdGNoIHdvcmthcm91bmQuXG4gICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52aWRlb1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0sIDEwMCk7XG4gIH1cblxuICBvblZpZGVvRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIFxuICAgIC8vIFN3aXRjaCB0byBuZXh0IHZpZGVvIGFuZCBhdXRvLXBsYXkgaXRcbiAgICBpZiAodGhpcy5oYXNNdWx0aXBsZVZpZGVvcyAmJiB0aGlzLnZpZGVvVXJscyAmJiB0aGlzLmN1cnJlbnRWaWRlb0luZGV4IDwgdGhpcy52aWRlb1VybHMubGVuZ3RoIC0gMSkge1xuICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDE7XG5cbiAgICAgIHRoaXMuZW5xdWV1ZU9wZXJhdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwobmV4dEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuY3VycmVudFZpZGVvVXJsKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFZpZGVvTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXApIHtcbiAgICAgIHRoaXMudmlkZW9FdmVudExpc3RlbmVyQ2xlYW51cCgpO1xuICAgICAgdGhpcy52aWRlb0V2ZW50TGlzdGVuZXJDbGVhbnVwID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IDA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAobm93IC0gbGFzdFVwZGF0ZSA8IDEwMCkgcmV0dXJuO1xuXG4gICAgICAgIGxhc3RVcGRhdGUgPSBub3c7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNcyA9IHZpZGVvLmN1cnJlbnRUaW1lICogMTAwMDtcblxuICAgICAgICBpZiAoIXRoaXMuZHJhZ2dpbmcgJiYgdGhpcy5wbGF5ZXJTdGF0ZSAhPT0gJ3N3aXRjaGluZycpIHtcbiAgICAgICAgICAvLyBQZXItdmlkZW8gcHJvZ3Jlc3MgKDAtMTAwJSBvZiBjdXJyZW50IHZpZGVvKVxuICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB2aWRlby5kdXJhdGlvbiAqIDEwMDA7XG4gICAgICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoY3VycmVudE1zIC8gZHVyYXRpb25NcykgKiAxMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRW1pdCBjdW11bGF0aXZlIHRpbWUgZm9yIHBhcmVudCAoc3RlcCBoaWdobGlnaHRpbmcpXG4gICAgICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0aGlzLmN1cnJlbnRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChzZWdtZW50U3RhcnQgKyBjdXJyZW50TXMpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuY2hlY2tNYXJrZXJIaXQoc2VnbWVudFN0YXJ0ICsgY3VycmVudE1zKTtcbiAgICAgICAgICB0aGlzLm1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk7XG5cbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0aGUgbGlicmFyeSByb3cgc28gdGhlIGN1cnJlbnRseS1wbGF5aW5nIGNsaXAgc3RheXMgdmlzaWJsZS5cbiAgICAgICAgICAvLyBPbmx5IHdoaWxlIHBsYXlpbmc7IHdoZW4gcGF1c2VkIHdlIGxlYXZlIHRoZSByb3cgd2hlcmUgdGhlIHVzZXIgbGVmdCBpdC5cbiAgICAgICAgICBpZiAodGhpcy5pc1BsYXlpbmcgJiYgdGhpcy5jdXJyZW50VmlkZW9JbmRleCAhPT0gdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gdGhpcy5jdXJyZW50VmlkZW9JbmRleDtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3VycmVudENsaXBJbnRvVmlldygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZXIpO1xuXG4gICAgICB0aGlzLnZpZGVvRXZlbnRMaXN0ZW5lckNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RpbWV1cGRhdGUnLCBoYW5kbGVyKTtcbiAgICAgIH07XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVQcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdmlkZW9VcmxzIHx8IHZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbFByZWxvYWRBbGxTZWdtZW50cygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wcmVsb2FkQWxsU2VnbWVudHModmlkZW9VcmxzKSwgNTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWxvYWQgYWxsIHZpZGVvIFVSTHMgaW4gc2VxdWVuY2UgKGZpcnN0LCB0aGVuIHNlY29uZCwgLi4uKSBzbyB0aGV5IGFyZSBjYWNoZWQuXG4gICAqIFdoZW4gdXNlciBqdW1wcyB0byBhbnkgc2VnbWVudCwgdGhhdCB2aWRlbyBpcyBsaWtlbHkgYWxyZWFkeSBsb2FkZWQuXG4gICAqL1xuICBwcml2YXRlIHByZWxvYWRBbGxTZWdtZW50cyh2aWRlb1VybHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF2aWRlb1VybHMgfHwgdmlkZW9VcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsUHJlbG9hZEFsbFNlZ21lbnRzKCk7XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgIHZpZGVvLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodmlkZW8pO1xuICAgIHRoaXMucHJlbG9hZEFsbFZpZGVvRWxlbWVudCA9IHZpZGVvO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBsb2FkTmV4dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgIT09IHZpZGVvIHx8IGluZGV4ID49IHZpZGVvVXJscy5sZW5ndGgpIHtcbiAgICAgICAgdmlkZW8ucmVtb3ZlKCk7XG4gICAgICAgIGlmICh0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPT09IHZpZGVvKSB0aGlzLnByZWxvYWRBbGxWaWRlb0VsZW1lbnQgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmwgPSB2aWRlb1VybHNbaW5kZXhdO1xuICAgICAgdmlkZW8uc3JjID0gdXJsO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZGRhdGEnLCBvbkRvbmUpO1xuICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRG9uZSk7XG4gICAgICAgIGxvYWROZXh0KCk7XG4gICAgICB9O1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsIG9uRG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkRvbmUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gb25Eb25lKCksIDE1MDAwKTtcbiAgICB9O1xuICAgIGxvYWROZXh0KCk7XG4gIH1cblxuICAvKiogUHJlbG9hZCBuZXh0IHNlZ21lbnQgd2hlbiB+NS0xMCBzZWNvbmRzIGZyb20gZW5kaW5nIHRvIG1pbmltaXplIHN3aXRjaGluZyBkZWxheSAqL1xuICBwcml2YXRlIG1heWJlUHJlbG9hZE5leHRTZWdtZW50KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNNdWx0aXBsZVZpZGVvcyB8fCAhdGhpcy52aWRlb1VybHMgfHwgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA+PSB0aGlzLnZpZGVvVXJscy5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8/LmR1cmF0aW9uKSByZXR1cm47XG4gICAgY29uc3QgdGltZUxlZnRJblNlZ21lbnQgPSAodmlkZW8uZHVyYXRpb24gLSB2aWRlby5jdXJyZW50VGltZSkgKiAxMDAwOyAvLyBtc1xuICAgIGlmICh0aW1lTGVmdEluU2VnbWVudCA+IDEwMDAwIHx8IHRpbWVMZWZ0SW5TZWdtZW50IDwgNTAwMCkgcmV0dXJuOyAvLyBQcmVsb2FkIHdoZW4gNS0xMHMgZnJvbSBlbmRcbiAgICBjb25zdCBuZXh0VXJsID0gdGhpcy52aWRlb1VybHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleCArIDFdO1xuICAgIGlmICghbmV4dFVybCkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnByZWxvYWRWaWRlb0VsZW1lbnQ/LnNyYyA9PT0gbmV4dFVybCkgcmV0dXJuOyAvLyBBbHJlYWR5IHByZWxvYWRpbmdcbiAgICB0aGlzLnByZWxvYWROZXh0U2VnbWVudChuZXh0VXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZE5leHRTZWdtZW50KHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCkge1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgdmlkZW8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuICAgIHZpZGVvLnByZWxvYWQgPSAnYXV0byc7XG4gICAgdmlkZW8uc3JjID0gdXJsO1xuICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2aWRlbyk7XG4gICAgdGhpcy5wcmVsb2FkVmlkZW9FbGVtZW50ID0gdmlkZW87XG4gICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkZGF0YScsICgpID0+IHtcbiAgICAgIHZpZGVvLnJlbW92ZSgpO1xuICAgICAgaWYgKHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9PT0gdmlkZW8pIHRoaXMucHJlbG9hZFZpZGVvRWxlbWVudCA9IG51bGw7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBhY3R1YWwgdmlkZW8gZHVyYXRpb25zIGJ5IGxvYWRpbmcgdmlkZW8gbWV0YWRhdGEuXG4gICAqXG4gICAqIEJyb3dzZXItcmVjb3JkZWQgV2ViTSBjbGlwcyBmcmVxdWVudGx5IHJlcG9ydCBgZHVyYXRpb24gPT09IEluZmluaXR5YCBvbiB0aGUgZmlyc3RcbiAgICogYGxvYWRlZG1ldGFkYXRhYCBmaXJpbmc7IHRoZSByZWFsIGR1cmF0aW9uIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgc2Vla2luZyBwYXN0IHRoZSBlbmRcbiAgICogKHNhbWUgdHJpY2sgYG9uTGlicmFyeUNsaXBNZXRhZGF0YUxvYWRlZGAgdXNlcyBmb3IgdGhlIGxpYnJhcnkgdGh1bWJuYWlscykuIFdlIG1pcnJvclxuICAgKiB0aGF0IHByb2JlIGhlcmUgc28gYGRldGVjdGVkVmlkZW9EdXJhdGlvbnNgIGVuZHMgdXAgZGVuc2UgYW5kIGB0b3RhbER1cmF0aW9uYCBpc1xuICAgKiBjb3JyZWN0IGluIEZ1bGwgVmlkZW8gbW9kZS5cbiAgICpcbiAgICogUHJlc2VydmVzIHByZXZpb3VzbHktZGV0ZWN0ZWQgZW50cmllcyBvbiByZS1pbnZvY2F0aW9uIChhcHBlbmQtb25seSB2aWRlb1VybHNcbiAgICogY2hhbmdlcyBzaG91bGRuJ3Qgd2lwZSBmaW5pc2hlZCBkZXRlY3Rpb25zIGZyb20gZWFybGllciBjbGlwcykuXG4gICAqL1xuICBwcml2YXRlIGRldGVjdFZpZGVvRHVyYXRpb25zKHZpZGVvVXJsczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAoIXZpZGVvVXJscyB8fCB2aWRlb1VybHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZXJ2ZSBwcmV2aW91c2x5LWRldGVjdGVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5kZXhlczsgdHJpbS9wYWQgdG8gY3VycmVudCBsZW5ndGguXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMuc2xpY2UoMCwgdmlkZW9VcmxzLmxlbmd0aCk7XG4gICAgdGhpcy5kZXRlY3RlZFZpZGVvRHVyYXRpb25zID0gcHJldmlvdXM7XG5cbiAgICB2aWRlb1VybHMuZm9yRWFjaCgodXJsLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdO1xuICAgICAgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoZXhpc3RpbmcpICYmIGV4aXN0aW5nID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgcmVzb2x2ZWQgZm9yIHRoaXMgVVJMIHBvc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRlbXBWaWRlbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICB0ZW1wVmlkZW8ucHJlbG9hZCA9ICdtZXRhZGF0YSc7XG4gICAgICB0ZW1wVmlkZW8ubXV0ZWQgPSB0cnVlO1xuICAgICAgKHRlbXBWaWRlbyBhcyBhbnkpLnBsYXlzSW5saW5lID0gdHJ1ZTtcbiAgICAgIC8vIENocm9tZSBpZ25vcmVzIGBjdXJyZW50VGltZSA9IE1BWF9TQUZFX0lOVEVHRVJgIG9uIGEgZGV0YWNoZWQgZWxlbWVudCwgc28gdGhlXG4gICAgICAvLyBgZHVyYXRpb25jaGFuZ2VgIGV2ZW50IG5ldmVyIGZpcmVzIGZvciBJbmZpbml0eS1kdXJhdGlvbiBXZWJNIGNsaXBzLiBBdHRhY2hcbiAgICAgIC8vIG9mZi1zY3JlZW4gKDHDlzEgaW52aXNpYmxlKSBzbyB0aGUgc2VlayBwcm9iZSBhY3R1YWxseSByZXNvbHZlcywgbWF0Y2hpbmdcbiAgICAgIC8vIHRoZSBsaWJyYXJ5IHRodW1ibmFpbHMnIGJlaGF2aW9yLlxuICAgICAgdGVtcFZpZGVvLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS53aWR0aCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLmhlaWdodCA9ICcxcHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICB0ZW1wVmlkZW8uc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRlbXBWaWRlby5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgICAgdGVtcFZpZGVvLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcFZpZGVvKTtcbiAgICAgIGxldCBwcm9iZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICB0ZW1wVmlkZW8uc3JjID0gJyc7XG4gICAgICAgIHRlbXBWaWRlby5yZW1vdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0b3JlSWZWYWxpZCA9IChkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9uc1tpbmRleF0gPSBkICogMTAwMDtcbiAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvbk1ldGFkYXRhT3JDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGQgPSB0ZW1wVmlkZW8uZHVyYXRpb247XG4gICAgICAgIGlmIChkID09PSBJbmZpbml0eSAmJiAhcHJvYmVkKSB7XG4gICAgICAgICAgLy8gV2ViTSB3aXRoIHVua25vd24gZHVyYXRpb246IGZvcmNlIHRoZSBicm93c2VyIHRvIHJlc29sdmUgYnkgc2Vla2luZyB0byB0aGVcbiAgICAgICAgICAvLyBlbmQuIFRoZSBzdWJzZXF1ZW50IGBkdXJhdGlvbmNoYW5nZWAgZXZlbnQgcmVwb3J0cyB0aGUgcmVhbCB2YWx1ZS5cbiAgICAgICAgICBwcm9iZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0ZW1wVmlkZW8uY3VycmVudFRpbWUgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7IC8qIHNvbWUgYnJvd3NlcnMgdGhyb3cgYmVmb3JlIG1ldGFkYXRhIGlzIHJlYWR5ICovIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0b3JlSWZWYWxpZChkKSkge1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NpbXVsYXRvcl0gRmFpbGVkIHRvIGxvYWQgbWV0YWRhdGEgZm9yIHZpZGVvICR7aW5kZXggKyAxfWApO1xuICAgICAgICB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnNbaW5kZXhdID0gMDtcbiAgICAgICAgY2xlYW51cCgpO1xuICAgICAgfTtcblxuICAgICAgdGVtcFZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25NZXRhZGF0YU9yQ2hhbmdlKTtcbiAgICAgIHRlbXBWaWRlby5hZGRFdmVudExpc3RlbmVyKCdkdXJhdGlvbmNoYW5nZScsIG9uTWV0YWRhdGFPckNoYW5nZSk7XG4gICAgICB0ZW1wVmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHRlbXBWaWRlby5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1bXVsYXRpdmUgZHVyYXRpb24gYm91bmRhcmllcyBmb3IgZWFjaCB2aWRlb1xuICAgKiBSZXR1cm5zIGFuIGFycmF5IHdoZXJlIGVhY2ggZWxlbWVudCBpcyBbc3RhcnREdXJhdGlvbiwgZW5kRHVyYXRpb25dIGZvciB0aGF0IHZpZGVvXG4gICAqIFVzZXMgZGV0ZWN0ZWQgdmlkZW8gZHVyYXRpb25zIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGxzIGJhY2sgdG8gdmlkZW9EdXJhdGlvbnMgaW5wdXRcbiAgICovXG4gIHByaXZhdGUgZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PiB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBkZXRlY3RlZCBkdXJhdGlvbnMgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIHByb3ZpZGVkIGR1cmF0aW9uc1xuICAgIGNvbnN0IGR1cmF0aW9ucyA9IHRoaXMuZGV0ZWN0ZWRWaWRlb0R1cmF0aW9ucy5sZW5ndGggPiAwIFxuICAgICAgPyB0aGlzLmRldGVjdGVkVmlkZW9EdXJhdGlvbnMgXG4gICAgICA6IFtdO1xuICAgIFxuICAgIGlmIChkdXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGJvdW5kYXJpZXM6IEFycmF5PHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfT4gPSBbXTtcbiAgICBsZXQgY3VtdWxhdGl2ZVN0YXJ0ID0gMDtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGR1cmF0aW9uIG9mIGR1cmF0aW9ucykge1xuICAgICAgYm91bmRhcmllcy5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGN1bXVsYXRpdmVTdGFydCxcbiAgICAgICAgZW5kOiBjdW11bGF0aXZlU3RhcnQgKyBkdXJhdGlvblxuICAgICAgfSk7XG4gICAgICBjdW11bGF0aXZlU3RhcnQgKz0gZHVyYXRpb247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBib3VuZGFyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXR0ZW4gYWxsIG1hcmtlcnMgcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGNoaWxkU3RlcHNcbiAgICovXG4gIHByaXZhdGUgZmxhdHRlbk1hcmtlcnMobWFya2VyczogU3RlcE1hcmtlcltdKTogU3RlcE1hcmtlcltdIHtcbiAgICBjb25zdCBmbGF0dGVuZWQ6IFN0ZXBNYXJrZXJbXSA9IFtdO1xuICAgIFxuICAgIGNvbnN0IGZsYXR0ZW5SZWN1cnNpdmUgPSAobWFya2VyczogU3RlcE1hcmtlcltdKSA9PiB7XG4gICAgICBtYXJrZXJzLmZvckVhY2gobWFya2VyID0+IHtcbiAgICAgICAgLy8gQWRkIHRoZSBtYXJrZXIgaXRzZWxmXG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKG1hcmtlcik7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNpdmVseSBhZGQgY2hpbGQgbWFya2Vyc1xuICAgICAgICBpZiAobWFya2VyLmNoaWxkU3RlcHMgJiYgbWFya2VyLmNoaWxkU3RlcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2VyLmNoaWxkU3RlcHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIFxuICAgIGZsYXR0ZW5SZWN1cnNpdmUobWFya2Vycyk7XG4gICAgcmV0dXJuIGZsYXR0ZW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tNYXJrZXJIaXQoZ2xvYmFsVGltZU1zOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNQbGF5aW5nIHx8IHRoaXMuZHJhZ2dpbmcpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBhbGwgbWFya2VycyAoaW5jbHVkaW5nIG5lc3RlZCBvbmVzKSBmb3IgYSBtYXRjaFxuICAgIGNvbnN0IGFsbE1hcmtlcnMgPSB0aGlzLmZsYXR0ZW5NYXJrZXJzKHRoaXMuc3RlcE1hcmtlcnMpO1xuICAgIGNvbnN0IHRvbGVyYW5jZSA9IDIwMDsgLy8gMjAwbXMgdG9sZXJhbmNlIGZvciBtYXRjaGluZ1xuICAgIFxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIGFsbE1hcmtlcnMpIHtcbiAgICAgIC8vIFNraXAgaWYgbWFya2VyIGRvZXNuJ3QgaGF2ZSB0ZXN0U3RlcElkXG4gICAgICBpZiAoIW1hcmtlci50ZXN0U3RlcElkKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGhpdFxuICAgICAgaWYgKHRoaXMuaGl0TWFya2Vycy5oYXMobWFya2VyLnRlc3RTdGVwSWQpKSBjb250aW51ZTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY3VycmVudCB0aW1lIG1hdGNoZXMgbWFya2VyIHRpbWUgKHdpdGhpbiB0b2xlcmFuY2UpXG4gICAgICBjb25zdCB0aW1lRGlmZmVyZW5jZSA9IE1hdGguYWJzKGdsb2JhbFRpbWVNcyAtIG1hcmtlci5jdW11bGF0aXZlRHVyYXRpb24pO1xuICAgICAgaWYgKHRpbWVEaWZmZXJlbmNlIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAvLyBNYXJrIGFzIGhpdCBhbmQgZW1pdCBldmVudFxuICAgICAgICB0aGlzLmhpdE1hcmtlcnMuYWRkKG1hcmtlci50ZXN0U3RlcElkKTtcbiAgICAgICAgdGhpcy5tYXJrZXJIaXQuZW1pdChtYXJrZXIpO1xuICAgICAgICBicmVhazsgLy8gT25seSBlbWl0IG9uZSBtYXJrZXIgcGVyIGNoZWNrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlRnVsbFNjcmVlbigpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNQbGF5aW5nID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLnZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmN1cnJlbnRUaW1lIHx8IDA7XG4gICAgXG4gICAgLy8gUGF1c2UgdmlkZW8gYmVmb3JlIGZ1bGxzY3JlZW4gdHJhbnNpdGlvbiB0byBhdm9pZCBzdGF0ZSBpc3N1ZXNcbiAgICBpZiAod2FzUGxheWluZykge1xuICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFRvZ2dsZSBmdWxsc2NyZWVuXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSAhdGhpcy5pc0Z1bGxTY3JlZW47XG4gICAgXG4gICAgLy8gUmVzZXQgcGxheWVyIHN0YXRlIHRvIGFsbG93IHJlLWluaXRpYWxpemF0aW9uIGFmdGVyIERPTSB1cGRhdGVcbiAgICAvLyBUaGUgc3RhdGUgbWlnaHQgYmUgc3R1Y2sgaW4gJ2xvYWRpbmcnIG9yICdlcnJvcicgYWZ0ZXIgZnVsbHNjcmVlbiB0cmFuc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWVyU3RhdGUgPT09ICdsb2FkaW5nJyB8fCB0aGlzLnBsYXllclN0YXRlID09PSAnZXJyb3InKSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ2lkbGUnO1xuICAgIH1cbiAgICBcbiAgICAvLyBXYWl0IGZvciBBbmd1bGFyIHRvIHVwZGF0ZSB0aGUgRE9NLCB0aGVuIHJlLWluaXRpYWxpemUgdmlkZW9cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKHZpZGVvKSB7XG4gICAgICAgIC8vIFJlc3RvcmUgdmlkZW8gcG9zaXRpb24gaWYgaXQgd2FzIHNldFxuICAgICAgICBpZiAoY3VycmVudFRpbWUgPiAwICYmIHZpZGVvLmR1cmF0aW9uID4gY3VycmVudFRpbWUpIHtcbiAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hcHBseSBwbGF5YmFjayByYXRlXG4gICAgICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZS1hdHRhY2ggbGlzdGVuZXJzXG4gICAgICAgIHRoaXMuYXR0YWNoVmlkZW9MaXN0ZW5lcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFJlc2V0IHN0YXRlIHRvICdwYXVzZWQnIChyZWFkeSB0byBwbGF5KVxuICAgICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXVsYXRvcl0gdG9nZ2xlRnVsbFNjcmVlbjogdmlkZW8gcmUtaW5pdGlhbGl6ZWQnLCB7XG4gICAgICAgICAgaXNGdWxsU2NyZWVuOiB0aGlzLmlzRnVsbFNjcmVlbixcbiAgICAgICAgICBjdXJyZW50VGltZTogdmlkZW8uY3VycmVudFRpbWUsXG4gICAgICAgICAgcGxheWVyU3RhdGU6IHRoaXMucGxheWVyU3RhdGVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHRvZ2dsZUZ1bGxTY3JlZW46IHZpZGVvIGVsZW1lbnQgbm90IGZvdW5kIGFmdGVyIHRyYW5zaXRpb24nKTtcbiAgICAgICAgLy8gVHJ5IGFnYWluIGFmdGVyIGEgYml0IG1vcmUgdGltZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB2aWRlb1JldHJ5ID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgIGlmICh2aWRlb1JldHJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hWaWRlb0xpc3RlbmVycygpO1xuICAgICAgICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgICAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgICB9XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uU2VnbWVudENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ICE9PSAndmlkZW8nKSB7XG4gICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc2V0VmlkZW9TdGF0ZUludGVybmFsKCk7XG4gICAgICAgIGlmICh0aGlzLmhhc011bHRpcGxlVmlkZW9zICYmIHRoaXMudmlkZW9VcmxzKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IDA7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kU2Vla0ludGVybmFsKDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzIHx8IGlzTmFOKHNlY29uZHMpKSByZXR1cm4gJzAwOjAwJztcbiAgICBcbiAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBNYXRoLmZsb29yKHNlY29uZHMpO1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyAzNjAwKTtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcigodG90YWxTZWNvbmRzICUgMzYwMCkgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IHRvdGFsU2Vjb25kcyAlIDYwO1xuICAgIFxuICAgIC8vIElmIGhvdXJzID4gMCwgc2hvdyBISDpNTTpTUyBmb3JtYXQsIG90aGVyd2lzZSBzaG93IE1NOlNTIGZvcm1hdFxuICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgIHJldHVybiBgJHtob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7bWlucy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9OiR7c2Vjcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGAke21pbnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfToke3NlY3MudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICBjYXB0dXJlVmlkZW8oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dDYXB0dXJlVmlkZW8gfHwgIXRoaXMuaXNMaXZlIHx8IHRoaXMuaXNDYXB0dXJpbmdWaWRlbykgcmV0dXJuO1xuICAgIHRoaXMuY2FwdHVyZVZpZGVvUmVxdWVzdGVkLmVtaXQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBDbGlwcyByb3cgZHJhZy10by1zY3JvbGwgKG1vdXNlIGVxdWl2YWxlbnQgb2YgdG91Y2gtc3dpcGUpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBEZXNpZ246IHRyYWNraW5nIHN0YXJ0cyBvbiBtb3VzZWRvd24gYnV0IHdlIERPTidUIGZsaXAgdG8gdGhlIFwiZHJhZ2dpbmdcIiB2aXN1YWwgc3RhdGVcbiAgLy8gb3IgYmxvY2sgY2xpY2tzIHVudGlsIHRoZSBwb2ludGVyIGNyb3NzZXMgYSA1cHggdGhyZXNob2xkLiBUaGF0IHdheSBhIHBsYWluIGNsaWNrXG4gIC8vIChubyBtb3ZlbWVudCkgcmVnaXN0ZXJzIG5vcm1hbGx5IG9uIHRoZSBjYXJkIC8gZG93bmxvYWQgYnV0dG9uIHdpdGggdGhlIHVzdWFsIGN1cnNvci5cbiAgb25DbGlwc01vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gMCB8fCAhc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgdGhpcy5jbGlwc0RyYWdTdGF0ZS5zdGFydFNjcm9sbExlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICB9XG5cbiAgb25DbGlwc01vdXNlTW92ZShldmVudDogTW91c2VFdmVudCwgc2Nyb2xsZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaXBzRHJhZ1N0YXRlLmRyYWdnaW5nIHx8ICFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGR4ID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuY2xpcHNEcmFnU3RhdGUuc3RhcnRYO1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlICYmIE1hdGguYWJzKGR4KSA+IDUpIHtcbiAgICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSA9IHRydWU7XG4gICAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IHRydWU7IC8vIGZsaXAgdGhlIGdyYWJiaW5nIGN1cnNvciBub3cgdGhhdCBpdCdzIGEgcmVhbCBkcmFnXG4gICAgfVxuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbExlZnQgPSB0aGlzLmNsaXBzRHJhZ1N0YXRlLnN0YXJ0U2Nyb2xsTGVmdCAtIGR4O1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpcHNNb3VzZVVwKF9ldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jbGlwc0RyYWdTdGF0ZS5kcmFnZ2luZykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcHNEcmFnU3RhdGUuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsaXBzRHJhZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUpIHtcbiAgICAgIC8vIEtlZXAgZGlkTW92ZT10cnVlIGJyaWVmbHkgc28gdGhlIHN5bnRoZXRpYyBjbGljayBmaXJlcyBhbmQgaXMgaWdub3JlZCwgdGhlbiByZXNldC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaXBzRHJhZ1N0YXRlLmRpZE1vdmUgPSBmYWxzZTsgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgb25DbGlwc01vdXNlTGVhdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2xpcHNNb3VzZVVwKGV2ZW50KTtcbiAgfVxuXG4gIC8qKiBDbGljayBoYW5kbGVyIG9uIGEgVmlkZW8gTGlicmFyeSBjYXJkIOKAlCBzd2l0Y2hlcyB0aGUgbWFpbiBwbGF5ZXIgdG8gdGhhdCBjbGlwIGFuZCBhdXRvLXBsYXlzLlxuICAgKiBTZWxlY3RpbmcgYSAqZGlmZmVyZW50KiBjbGlwIGFsc28gY29sbGFwc2VzIHRoZSBsaWJyYXJ5IHNvIHRoZSBuZXdseS1wbGF5aW5nIHZpZGVvIGlzIHVub2JzdHJ1Y3RlZDtcbiAgICogcmUtY2xpY2tpbmcgdGhlIGFjdGl2ZSBjbGlwIGp1c3QgdG9nZ2xlcyBwbGF5L3BhdXNlIGFuZCBrZWVwcyB0aGUgZHJhd2VyIHN0YXRlLlxuICAgKiBJZ25vcmVkIHdoZW4gdGhlIGNsaWNrIG9yaWdpbmF0ZWQgZnJvbSBhIGhvcml6b250YWwgZHJhZy1zY3JvbGwuICovXG4gIHNlbGVjdExpYnJhcnlDbGlwKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbGlwc0RyYWdTdGF0ZS5kaWRNb3ZlKSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCBpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy52aWRlb1VybHMubGVuZ3RoKSByZXR1cm47XG4gICAgdGhpcy5uZXdWaWRlb0luZGV4ZXMuZGVsZXRlKGluZGV4KTtcblxuICAgIC8vIEZ1bGwtbW9kZTogc2VlayB0aGUgZ2xvYmFsIHRpbWVsaW5lIHRvIHRoaXMgY2xpcCdzIHN0YXJ0LiBLZWVwIGZ1bGwgbW9kZSBhbmRcbiAgICAvLyB0aGUgbGlicmFyeSBwYW5lbCBvcGVuIHNvIHRoZSB1c2VyIGNhbiBzZWUgdGhlIGhpZ2hsaWdodCBmb2xsb3cgYWxvbmcuXG4gICAgLy8gSWYgdGhlIGNsaWNrZWQgY2FyZCBpcyB0aGUgb25lIGFscmVhZHkgcGxheWluZyB1bmRlciB0aGUgaG9vZCwgdHJlYXQgdGhlXG4gICAgLy8gY2xpY2sgYXMgYSBwbGF5L3BhdXNlIHRvZ2dsZSAodGhlIGNhcmQncyBvdmVybGF5IGljb24gcmVmbGVjdHMgdGhhdCBzdGF0ZSkuXG4gICAgaWYgKHRoaXMuaXNWaWRlb0Z1bGxNb2RlKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVQbGF5KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvdW5kYXJpZXMgPSB0aGlzLnNlZ21lbnRCb3VuZGFyaWVzO1xuICAgICAgY29uc3QgdGFyZ2V0R2xvYmFsTXMgPSBpbmRleCA9PT0gMCA/IDAgOiAoYm91bmRhcmllc1tpbmRleCAtIDFdID8/IDApO1xuICAgICAgY29uc3Qgc2hvdWxkUmVzdW1lID0gdGhpcy5pc1BsYXlpbmc7XG4gICAgICB0aGlzLnN3aXRjaFRvVmlkZW9BbmRTZWVrKHRhcmdldEdsb2JhbE1zKTtcbiAgICAgIGlmIChzaG91bGRSZXN1bWUpIHtcbiAgICAgICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTUwKSk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbGF5VmlkZW9JbnRlcm5hbCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuY3VycmVudFZpZGVvSW5kZXgpIHtcbiAgICAgIHRoaXMudG9nZ2xlUGxheSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbChpbmRleCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUGVyLWNhcmQgbWV0YWRhdGEgaGFuZGxlciDigJQgY2FjaGVzIGR1cmF0aW9uIHNvIHRoZSBgMDo0MmAgdGh1bWJuYWlsIGxhYmVsIGNhbiByZW5kZXIuXG4gICAqIEJvdW5kIHRvIEJPVEggYGxvYWRlZG1ldGFkYXRhYCBhbmQgYGR1cmF0aW9uY2hhbmdlYDpcbiAgICogICAtIFNvbWUgTVA0cyAoZXNwLiBzaG9ydCBjbGlwcyB3aXRoIG1vb3YgYXQgdGhlIGVuZCkgcmVwb3J0IGEgd3JvbmcvcGFydGlhbCBkdXJhdGlvblxuICAgKiAgICAgb24gYGxvYWRlZG1ldGFkYXRhYDsgQ2hyb21lIGxhdGVyIGNvcnJlY3RzIGl0IHZpYSBgZHVyYXRpb25jaGFuZ2VgLiBMaXN0ZW5pbmcgdG9cbiAgICogICAgIGJvdGggKyBrZWVwaW5nIHRoZSBtYXgtc28tZmFyIGF2b2lkcyBzdGFsZSB3cm9uZyB2YWx1ZXMgbGlrZSBcIjAwOjAxXCIgZm9yIGEgNXMgY2xpcC5cbiAgICogICAtIEZvciBzdHJlYW1lZCBNUDRzIHRoYXQgcmVwb3J0IGBJbmZpbml0eWAsIHNlZWsgdG8gdGhlIGVuZCBvbmNlIHNvIENocm9tZSBmZXRjaGVzXG4gICAqICAgICB0aGUgY3Vlcy90cmFpbGVyIGFuZCBmaXJlcyBhIGNvcnJlY3RlZCBgZHVyYXRpb25jaGFuZ2VgLiAqL1xuICBvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaW5kZXg6IG51bWJlciwgdmlkZW9FbDogSFRNTFZpZGVvRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB2aWRlb0VsPy5kdXJhdGlvbjtcbiAgICBpZiAoZCA9PT0gSW5maW5pdHkgJiYgIXZpZGVvRWwuZGF0YXNldFsnY3FhRHVyYXRpb25Qcm9iZWQnXSkge1xuICAgICAgdmlkZW9FbC5kYXRhc2V0WydjcWFEdXJhdGlvblByb2JlZCddID0gJzEnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlkZW9FbC5jdXJyZW50VGltZSA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgfSBjYXRjaCAoXykgeyAvKiBzb21lIGJyb3dzZXJzIHRocm93IGJlZm9yZSBtZXRhZGF0YTsgaWdub3JlICovIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZShkKSAmJiBkID4gMCkge1xuICAgICAgY29uc3QgcHJldiA9IHRoaXMubGlicmFyeVZpZGVvRHVyYXRpb25zLmdldChpbmRleCkgfHwgMDtcbiAgICAgIGlmIChkID4gcHJldikge1xuICAgICAgICB0aGlzLmxpYnJhcnlWaWRlb0R1cmF0aW9ucy5zZXQoaW5kZXgsIGQpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmFja0xpYnJhcnlDbGlwQnlJbmRleChpbmRleDogbnVtYmVyLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluZGV4ICsgJzonICsgKHVybCB8fCAnJyk7XG4gIH1cblxuICAvKiogRG93bmxvYWQgdGhlIGNsaXAgYXQgYGluZGV4YC4gU3RyZWFtcyB0aGUgYnl0ZXMgd2l0aCBmZXRjaCBzbyB3ZSBjYW4gc2hvdyBwcm9ncmVzcyxcbiAgICogdGhlbiBzYXZlcyB2aWEgYSB0ZW1wb3JhcnkgYmxvYiBVUkwgc28gdGhlIGZpbGUgY29tZXMgZG93biBvbiB0aGUgc2FtZSBwYWdlXG4gICAqIChubyBuZXcgdGFiIC8gd2luZG93KS4gRmFsbHMgYmFjayB0byBhIGRpcmVjdCBhbmNob3IgY2xpY2sgaWYgZmV0Y2ggaXMgdW5hdmFpbGFibGUgb3IgZmFpbHMuICovXG4gIGFzeW5jIGRvd25sb2FkQ2xpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2xpcHNEcmFnU3RhdGUuZGlkTW92ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IEFycmF5LmlzQXJyYXkodGhpcy52aWRlb1VybHMpID8gdGhpcy52aWRlb1VybHNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghdXJsIHx8IHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmhhcyhpbmRleCkpIHJldHVybjtcblxuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5kZXJpdmVDbGlwRmlsZW5hbWUodXJsLCBpbmRleCk7XG4gICAgdGhpcy5kb3dubG9hZGluZ0luZGV4ZXMuYWRkKGluZGV4KTtcbiAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3Muc2V0KGluZGV4LCAwKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBtb2RlOiAnY29ycycsIGNyZWRlbnRpYWxzOiAnb21pdCcgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rIHx8ICFyZXNwb25zZS5ib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRG93bmxvYWQgZmFpbGVkOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvdGFsID0gTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKSB8fCAwO1xuICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UuYm9keS5nZXRSZWFkZXIoKTtcbiAgICAgIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gICAgICBsZXQgcmVjZWl2ZWQgPSAwO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICBpZiAoZG9uZSkgYnJlYWs7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICByZWNlaXZlZCArPSB2YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZFByb2dyZXNzLnNldChpbmRleCwgTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChyZWNlaXZlZCAvIHRvdGFsKSAqIDEwMCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKGNodW5rcyBhcyBCbG9iUGFydFtdLCB7IHR5cGU6ICd2aWRlby93ZWJtJyB9KTtcbiAgICAgIHRoaXMuc2F2ZUJsb2JBc0Rvd25sb2FkKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAvLyBDT1JTIGJsb2NrIG9yIG5ldHdvcmsgZmFpbHVyZSDigJQgZmFsbCBiYWNrIHRvIGEgZGlyZWN0IGFuY2hvciBjbGljayAobWF5IG9wZW4gaW4gYSBuZXcgdGFiXG4gICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIHNlcnZlcidzIENvbnRlbnQtRGlzcG9zaXRpb24sIGJ1dCBhdCBsZWFzdCBhbHdheXMgdHJpZ2dlcnMgdGhlIGJyb3dzZXIncyBzYXZlIGZsb3cpLlxuICAgICAgdGhpcy50cmlnZ2VyRGlyZWN0RG93bmxvYWQodXJsLCBmaWxlbmFtZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmdJbmRleGVzLmRlbGV0ZShpbmRleCk7XG4gICAgICB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZGVsZXRlKGluZGV4KTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVyaXZlQ2xpcEZpbGVuYW1lKHVybDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdSA9IG5ldyBVUkwodXJsKTtcbiAgICAgIGNvbnN0IGxhc3QgPSAodS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS5zcGxpdCgnPycpWzBdO1xuICAgICAgaWYgKGxhc3QgJiYgL1xcLlthLXowLTldKyQvaS50ZXN0KGxhc3QpKSByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LSR7bGFzdH1gO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICByZXR1cm4gYGNsaXAtJHtpbmRleCArIDF9LndlYm1gO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQmxvYkFzRG93bmxvYWQoYmxvYjogQmxvYiwgZmlsZW5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICBhLmhyZWYgPSBvYmplY3RVcmw7XG4gICAgICBhLmRvd25sb2FkID0gZmlsZW5hbWU7XG4gICAgICBhLnJlbCA9ICdub29wZW5lcic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCksIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaXJjdW1mZXJlbmNlIG9mIHRoZSA2LXJhZGl1cyBwcm9ncmVzcyByaW5nIChzZWUgY2xpcC1kb3dubG9hZC1idG5fX3JpbmcgaW4gdGVtcGxhdGUpLiAqL1xuICByZWFkb25seSBkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlOiBudW1iZXIgPSAyICogTWF0aC5QSSAqIDY7XG5cbiAgLyoqIHN0cm9rZS1kYXNob2Zmc2V0IGZvciB0aGUgcHJvZ3Jlc3MgcmluZyBvZiBjbGlwIGBpbmRleGA7IDAgPSBmdWxsLCBjaXJjdW1mZXJlbmNlID0gZW1wdHkuICovXG4gIGRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCB0aGlzLmRvd25sb2FkUHJvZ3Jlc3MuZ2V0KGluZGV4KSB8fCAwKSk7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRSaW5nQ2lyY3VtZmVyZW5jZSAqICgxIC0gcGN0IC8gMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJpZ2dlckRpcmVjdERvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgIGEucmVsID0gJ25vb3BlbmVyJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICB9XG5cbiAgb25TaG93RnVsbFZpZGVvKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG93VmlkZW9MaWJyYXJ5KSByZXR1cm47XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMudmlkZW9VcmxzKSB8fCB0aGlzLnZpZGVvVXJscy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmlzVmlkZW9GdWxsTW9kZSA9IHRydWU7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9IHRydWU7XG4gICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5nbG9iYWxEcmFnUHJvZ3Jlc3MgPSAwO1xuICAgIHRoaXMubGFzdFNjcm9sbGVkQ2xpcEluZGV4ID0gLTE7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFJlc2V0SW50ZXJuYWwoMCk7XG4gICAgICBhd2FpdCB0aGlzLnBsYXlWaWRlb0ludGVybmFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBvbkV4aXRGdWxsVmlkZW8oKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvRnVsbE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkID0gdHJ1ZTtcbiAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB0aGlzLmdsb2JhbERyYWdQcm9ncmVzcyA9IDA7XG4gICAgdGhpcy5sYXN0U2Nyb2xsZWRDbGlwSW5kZXggPSAtMTtcbiAgICB0aGlzLmVucXVldWVPcGVyYXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCgwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIb3Jpem9udGFsbHkgc2Nyb2xscyB0aGUgYC5jbGlwcy1yb3dgIHNvIHRoZSBjdXJyZW50bHktcGxheWluZyBjbGlwIGNhcmQgaXNcbiAgICogaW4gdGhlIHZpc2libGUgc3RyaXAuIE5vLW9wIGlmIHRoZSBjYXJkIGlzIGFscmVhZHkgb24gc2NyZWVuLiBDYWxsZXIgZ3VhcmRzXG4gICAqIG9uIGBpc1BsYXlpbmdgIHNvIHRoZSB1c2VyIGNhbiBmcmVlbHkgc2Nyb2xsIHRoZSByb3cgd2hpbGUgcGF1c2VkLiAqL1xuICBwcml2YXRlIHNjcm9sbEN1cnJlbnRDbGlwSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLmNsaXBzU2Nyb2xsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFzY3JvbGxlcikgcmV0dXJuO1xuICAgIGNvbnN0IGNhcmRzID0gc2Nyb2xsZXIucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy5jbGlwLWNhcmQnKTtcbiAgICBjb25zdCBjYXJkID0gY2FyZHNbdGhpcy5jdXJyZW50VmlkZW9JbmRleF07XG4gICAgaWYgKCFjYXJkKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWRkaW5nID0gODtcbiAgICBjb25zdCBjYXJkTGVmdCA9IGNhcmQub2Zmc2V0TGVmdDtcbiAgICBjb25zdCBjYXJkUmlnaHQgPSBjYXJkTGVmdCArIGNhcmQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3Qgdmlld0xlZnQgPSBzY3JvbGxlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IHZpZXdMZWZ0ICsgc2Nyb2xsZXIuY2xpZW50V2lkdGg7XG5cbiAgICBpZiAoY2FyZExlZnQgPCB2aWV3TGVmdCArIHBhZGRpbmcpIHtcbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvKHsgbGVmdDogTWF0aC5tYXgoMCwgY2FyZExlZnQgLSBwYWRkaW5nKSwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgIH0gZWxzZSBpZiAoY2FyZFJpZ2h0ID4gdmlld1JpZ2h0IC0gcGFkZGluZykge1xuICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG8oeyBsZWZ0OiBjYXJkUmlnaHQgLSBzY3JvbGxlci5jbGllbnRXaWR0aCArIHBhZGRpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVWaWRlb0xpYnJhcnlDb2xsYXBzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA9ICF0aGlzLmlzVmlkZW9MaWJyYXJ5Q29sbGFwc2VkO1xuICB9XG5cbiAgZ2V0U3RhdHVzQmFkZ2VDbGFzcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gJ2NxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMS41IGNxYS1weC1bOXB4XSBjcWEtcHktWzNweF0gY3FhLXJvdW5kZWQtWzZweF0gY3FhLWgtWzIxcHhdJztcbiAgICBzd2l0Y2ggKHRoaXMubGl2ZVN0YXR1cykge1xuICAgICAgY2FzZSAnSW4gUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnRXhlY3V0aW9uJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNFMEYyRkVdIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bIzdERDNGQ11gO1xuICAgICAgY2FzZSAnUGF1c2VkJzpcbiAgICAgICAgcmV0dXJuIGAke2Jhc2VDbGFzc2VzfSBjcWEtYmctWyNGRUYzQzddIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1bI0ZDRDM0RF1gO1xuICAgICAgY2FzZSAnQWJvcnRlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkVFMkUyXSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGQ0E1QTVdYDtcbiAgICAgIGNhc2UgJ0ZhaWxlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdYDtcbiAgICAgIGNhc2UgJ1Bhc3NlZCc6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLVsjRDFGQUU1XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyM2RUU3QjddYDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgJHtiYXNlQ2xhc3Nlc30gY3FhLWJnLWdyYXktMjAwIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1ncmF5LTMwMGA7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdHVzVGV4dENsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmxpdmVTdGF0dXMpIHtcbiAgICAgIGNhc2UgJ0luIFByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ0V4ZWN1dGlvbic6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzAyODRDN10gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ1BhdXNlZCc6XG4gICAgICAgIHJldHVybiAnY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0Q5NzcwNl0gY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICAgIGNhc2UgJ0Fib3J0ZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNEQzI2MjZdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdGYWlsZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyNDNjM1MzVdIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBjYXNlICdQYXNzZWQnOlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMwNTk2NjldIGNxYS1sZWFkaW5nLVsxNXB4XSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsxMHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS02MDAgY3FhLWxlYWRpbmctWzE1cHhdJztcbiAgICB9XG4gIH1cblxuICBnZXQgcHJvY2Vzc2VkVHJhY2VVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudHJhY2VWaWV3VXJsKSByZXR1cm4gJyc7XG4gICAgXG4gICAgaWYgKHRoaXMudHJhY2VWaWV3VXJsLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICB0cmFjZTogdGhpcy50cmFjZVZpZXdVcmwsXG4gICAgICAgIGhpZGVIZWFkZXI6ICd0cnVlJyxcbiAgICAgICAgaGlkZUJyYW5kaW5nOiAndHJ1ZScsXG4gICAgICAgIGVtYmVkOiAndHJ1ZScsXG4gICAgICAgIG1pbmltYWw6ICd0cnVlJyxcbiAgICAgICAgbm9IZWFkZXI6ICd0cnVlJ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBgaHR0cHM6Ly90cmFjZS5wbGF5d3JpZ2h0LmRldi8/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy50cmFjZVZpZXdVcmw7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNhZmVUcmFjZVVybCgpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnByb2Nlc3NlZFRyYWNlVXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodXJsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMudHJhY2VWaWV3ZXJFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy5zYWZlVHJhY2VVcmwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoJycpO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJhY2VWaWV3ZXJMb2FkKCk6IHZvaWQge1xuICAgIHRoaXMudHJhY2VWaWV3ZXJMb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy50cmFjZVZpZXdlckVycm9yID0gZmFsc2U7XG4gIH1cblxuICBvblRyYWNlVmlld2VyRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy50cmFjZVZpZXdlckxvYWRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRyYWNlVmlld2VyRXJyb3IgPSB0cnVlO1xuICB9XG5cbiAgb25TcGVlZENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U3BlZWQgPSB2YWx1ZTtcbiAgICAvLyBXaGVuZXZlciBzcGVlZCBjaGFuZ2VzLCBhcHBseSBpdCB0byB0aGUgY3VycmVudCB2aWRlb1xuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG4gICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZVNwZWVkQ29udHJvbCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzU3BlZWRDb250cm9sT3BlbiA9ICF0aGlzLmlzU3BlZWRDb250cm9sT3BlbjtcbiAgICBpZiAodGhpcy5pc1NwZWVkQ29udHJvbE9wZW4pIHtcbiAgICAgIHRoaXMuYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVTcGVlZENvbnRyb2xDbGlja091dHNpZGVMaXN0ZW5lcigpO1xuICAgIFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICh0YXJnZXQgJiYgdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgJiYgXG4gICAgICAgICAgICAhdGhpcy5zcGVlZENvbnRyb2xDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgdGhpcy5pc1NwZWVkQ29udHJvbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZVNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlU3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BlZWRDb250cm9sQ2xpY2tPdXRzaWRlSGFuZGxlcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnNwZWVkQ29udHJvbENsaWNrT3V0c2lkZUhhbmRsZXIpO1xuICAgICAgdGhpcy5zcGVlZENvbnRyb2xDbGlja091dHNpZGVIYW5kbGVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNlZ21lbnRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGJhc2VTZWdtZW50czogU2VnbWVudE9wdGlvbltdID0gW1xuICAgICAgeyBsYWJlbDogJ1NjcmVlbnNob3RzJywgdmFsdWU6ICdzY3JlZW5zaG90cycsIGljb246ICdwaG90bycgIH0sXG4gICAgXTtcbiAgICBcbiAgICAvLyBPbmx5IGFkZCBWaWRlbyB0YWIgaWYgaGlkZVZpZGVvVGFiIGlzIGZhbHNlXG4gICAgaWYgKCF0aGlzLmhpZGVWaWRlb1RhYikge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1ZpZGVvJywgdmFsdWU6ICd2aWRlbycsIGljb246ICd2aWRlb2NhbScgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLnRyYWNlVmlld1VybCkge1xuICAgICAgYmFzZVNlZ21lbnRzLnB1c2goeyBsYWJlbDogJ1RyYWNlJywgdmFsdWU6ICd0cmFjZScsIGljb246ICdncmFwaGljX2VxJyB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5zZWdtZW50cyA9IGJhc2VTZWdtZW50cztcbiAgICBcbiAgICAvLyBJZiBjdXJyZW50IHZpZXcgaXMgJ3ZpZGVvJyBhbmQgdmlkZW8gdGFiIGlzIGhpZGRlbiwgc3dpdGNoIHRvIHNjcmVlbnNob3RzXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd2aWRlbycgJiYgdGhpcy5oaWRlVmlkZW9UYWIpIHtcbiAgICAgIHRoaXMuY3VycmVudFZpZXcgPSAnc2NyZWVuc2hvdHMnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25WaWRlb0VsZW1lbnRSZWFkeSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMuX3ZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF2aWRlbykgcmV0dXJuO1xuXG4gICAgY29uc29sZS5sb2coJ1tTaW11bGF0b3JdIG9uVmlkZW9FbGVtZW50UmVhZHk6IHZpZGVvIGVsZW1lbnQgcmVhZHknLCB7XG4gICAgICBwbGF5ZXJTdGF0ZTogdGhpcy5wbGF5ZXJTdGF0ZSxcbiAgICAgIGlzRnVsbFNjcmVlbjogdGhpcy5pc0Z1bGxTY3JlZW4sXG4gICAgICByZWFkeVN0YXRlOiB2aWRlby5yZWFkeVN0YXRlXG4gICAgfSk7XG5cbiAgICAvLyBBbnkgaW4tZmxpZ2h0IG9wZXJhdGlvbiBvbiBhIHByaW9yIDx2aWRlbz4gZWxlbWVudCBpcyBkZWFkIG9uY2UgaXQgdW5tb3VudHNcbiAgICAvLyAoZS5nLiBsaXZlU2Vzc2lvblZpZXcgdG9nZ2xlZCBtaWQtc3dpdGNoIOKAlCB0aGUgZGV0YWNoZWQgZWxlbWVudCBuZXZlciBmaXJlc1xuICAgIC8vIGBsb2FkZWRtZXRhZGF0YWAgYW5kIGBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbGAgaGFuZ3MgZm9yZXZlciwgYmxvY2tpbmdcbiAgICAvLyB0aGUgb3BlcmF0aW9uUXVldWUgYmVoaW5kIGl0KS4gUmVzZXQgZnJvbSBldmVyeSB0cmFuc2llbnQgc3RhdGUgYW5kIGRyb3AgdGhlXG4gICAgLy8gc3R1Y2sgY2hhaW4gc28gc3Vic2VxdWVudCB0b2dnbGVQbGF5IC8gc2VlayAvIHN3aXRjaCBjYWxscyBhY3R1YWxseSBydW4uXG4gICAgaWYgKFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAnc3dpdGNoaW5nJyB8fFxuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9PT0gJ3NlZWtpbmcnIHx8XG4gICAgICB0aGlzLnBsYXllclN0YXRlID09PSAncGxheWluZydcbiAgICApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbU2ltdWxhdG9yXSBvblZpZGVvRWxlbWVudFJlYWR5OiByZXNldHRpbmcgc3R1Y2sgc3RhdGUnLCB0aGlzLnBsYXllclN0YXRlKTtcbiAgICAgIHRoaXMucGxheWVyU3RhdGUgPSAnaWRsZSc7XG4gICAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5wbGF5UHJvbWlzZSA9IG51bGw7XG4gICAgICB0aGlzLm9wZXJhdGlvblF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGN1cnJlbnQgcGxheWJhY2sgc3BlZWQgd2hlbiB0aGUgdmlkZW8gZWxlbWVudCBpcyBmaXJzdCByZWFkeVxuICAgIHRoaXMuYXBwbHlDdXJyZW50UGxheWJhY2tSYXRlKCk7XG5cbiAgICB0aGlzLmF0dGFjaFZpZGVvTGlzdGVuZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Q3VycmVudFBsYXliYWNrUmF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvKSByZXR1cm47XG5cbiAgICBjb25zdCBudW1lcmljID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTcGVlZC5yZXBsYWNlKCd4JywgJycpKTtcbiAgICBjb25zdCByYXRlID0gIWlzTmFOKG51bWVyaWMpICYmIG51bWVyaWMgPiAwID8gbnVtZXJpYyA6IDE7XG4gICAgdmlkZW8ucGxheWJhY2tSYXRlID0gcmF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZFZpZGVvSW5kZXhGb3JUaW1lc3RhbXAoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmhhc011bHRpcGxlVmlkZW9zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZGFyaWVzID0gdGhpcy5nZXRWaWRlb0R1cmF0aW9uQm91bmRhcmllcygpO1xuICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRmluZCB3aGljaCB2aWRlbyBjb250YWlucyB0aGlzIHRpbWVzdGFtcFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm91bmRhcmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYm91bmRhcnkgPSBib3VuZGFyaWVzW2ldO1xuICAgICAgaWYgKGN1bXVsYXRpdmVUaW1lc3RhbXAgPj0gYm91bmRhcnkuc3RhcnQgJiYgY3VtdWxhdGl2ZVRpbWVzdGFtcCA8IGJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aW1lc3RhbXAgaXMgZXhhY3RseSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IHZpZGVvLCByZXR1cm4gdGhlIGxhc3QgdmlkZW8gaW5kZXhcbiAgICBpZiAoYm91bmRhcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsYXN0Qm91bmRhcnkgPSBib3VuZGFyaWVzW2JvdW5kYXJpZXMubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoY3VtdWxhdGl2ZVRpbWVzdGFtcCA9PT0gbGFzdEJvdW5kYXJ5LmVuZCkge1xuICAgICAgICByZXR1cm4gYm91bmRhcmllcy5sZW5ndGggLSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXRJbnRlcm5hbCh0YXJnZXRWaWRlb0luZGV4OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2aWRlbyA9IHRoaXMudnBsYXllcj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIXZpZGVvIHx8ICF0aGlzLnZpZGVvVXJscyB8fCB0YXJnZXRWaWRlb0luZGV4IDwgMCB8fCB0YXJnZXRWaWRlb0luZGV4ID49IHRoaXMudmlkZW9VcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVzZXItaW5pdGlhdGVkIG5hdmlnYXRpb24g4oCUIHJlc2V0IHRoZSBhdXRvLXJlY292ZXJ5IHJldHJ5IGJ1ZGdldC5cbiAgICB0aGlzLnJlY292ZXJ5QXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0V2luZG93U3RhcnQgPSAwO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudFZpZGVvSW5kZXggPT09IHRhcmdldFZpZGVvSW5kZXgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzZXRWaWRlb1N0YXRlSW50ZXJuYWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBsYXllclN0YXRlID0gJ3N3aXRjaGluZyc7XG5cbiAgICB0cnkge1xuICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMudmlkZW9QYXVzZS5lbWl0KCk7XG4gICAgICB0aGlzLmlzVmlkZW9QbGF5aW5nQ2hhbmdlLmVtaXQoZmFsc2UpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YUxvYWRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2V0dGxlID0gKGZuOiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICB2aWRlby5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEpO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25Mb2FkZWRNZXRhZGF0YSA9ICgpID0+IHNldHRsZShyZXNvbHZlKTtcbiAgICAgICAgY29uc3Qgb25FcnJvciA9ICgpID0+IHNldHRsZSgoKSA9PiByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCB2aWRlbycpKSk7XG5cbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCBvbkxvYWRlZE1ldGFkYXRhLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIHZpZGVvLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudFZpZGVvSW5kZXggPSB0YXJnZXRWaWRlb0luZGV4O1xuXG4gICAgICBhd2FpdCBtZXRhZGF0YUxvYWRlZDtcblxuICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnBsYXlQcm9taXNlID0gbnVsbDtcbiAgICAgIHRoaXMuaGl0TWFya2Vycy5jbGVhcigpO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSAtMTtcblxuICAgICAgY29uc3Qgc2VnbWVudFN0YXJ0ID0gdGFyZ2V0VmlkZW9JbmRleCA9PT0gMCA/IDAgOiAodGhpcy5zZWdtZW50Qm91bmRhcmllc1t0YXJnZXRWaWRlb0luZGV4IC0gMV0gPz8gMCk7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KHNlZ21lbnRTdGFydCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2ltdWxhdG9yXSBzd2l0Y2hUb1ZpZGVvQW5kUmVzZXQgZmFpbGVkOicsIGVycik7XG4gICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wbGF5ZXJTdGF0ZSA9ICdwYXVzZWQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoVG9WaWRlb0FuZFNlZWsoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lbnF1ZXVlT3BlcmF0aW9uKCgpID0+IHRoaXMuc3dpdGNoVG9WaWRlb0FuZFNlZWtJbnRlcm5hbChjdW11bGF0aXZlVGltZXN0YW1wKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN3aXRjaFRvVmlkZW9BbmRTZWVrSW50ZXJuYWwoY3VtdWxhdGl2ZVRpbWVzdGFtcDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVXNlci1pbml0aWF0ZWQgc2VlayDigJQgcmVzZXQgdGhlIGF1dG8tcmVjb3ZlcnkgcmV0cnkgYnVkZ2V0LlxuICAgIHRoaXMucmVjb3ZlcnlBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5yZWNvdmVyeUF0dGVtcHRXaW5kb3dTdGFydCA9IDA7XG5cbiAgICBpZiAoIXRoaXMuaGFzTXVsdGlwbGVWaWRlb3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Vla1RvVGltZUludGVybmFsKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZpZGVvSW5kZXggPSB0aGlzLmZpbmRWaWRlb0luZGV4Rm9yVGltZXN0YW1wKGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIGlmICh0YXJnZXRWaWRlb0luZGV4ID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrOiBDb3VsZCBub3QgZmluZCB2aWRlbyBmb3IgdGltZXN0YW1wJywgY3VtdWxhdGl2ZVRpbWVzdGFtcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRhcmllcyA9IHRoaXMuZ2V0VmlkZW9EdXJhdGlvbkJvdW5kYXJpZXMoKTtcbiAgICBjb25zdCB0YXJnZXRCb3VuZGFyeSA9IGJvdW5kYXJpZXNbdGFyZ2V0VmlkZW9JbmRleF07XG4gICAgY29uc3QgcmVsYXRpdmVUaW1lc3RhbXAgPSBjdW11bGF0aXZlVGltZXN0YW1wIC0gdGFyZ2V0Qm91bmRhcnkuc3RhcnQ7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50VmlkZW9JbmRleCA9PT0gdGFyZ2V0VmlkZW9JbmRleCkge1xuICAgICAgYXdhaXQgdGhpcy5zZWVrVG9UaW1lSW50ZXJuYWwocmVsYXRpdmVUaW1lc3RhbXApO1xuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZGVvID0gdGhpcy52cGxheWVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghdmlkZW8pIHJldHVybjtcblxuICAgIHRoaXMucGxheWVyU3RhdGUgPSAnc3dpdGNoaW5nJztcblxuICAgIHRyeSB7XG4gICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucGxheVByb21pc2UgPSBudWxsO1xuICAgICAgdGhpcy52aWRlb1BhdXNlLmVtaXQoKTtcbiAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhTG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzZXR0bGUgPSAoZm46ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWRlZG1ldGFkYXRhJywgb25Mb2FkZWRNZXRhZGF0YSk7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICBmbigpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvbkxvYWRlZE1ldGFkYXRhID0gKCkgPT4gc2V0dGxlKHJlc29sdmUpO1xuICAgICAgICBjb25zdCBvbkVycm9yID0gKCkgPT4gc2V0dGxlKCgpID0+IHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHZpZGVvJykpKTtcblxuICAgICAgICB2aWRlby5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRtZXRhZGF0YScsIG9uTG9hZGVkTWV0YWRhdGEsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jdXJyZW50VmlkZW9JbmRleCA9IHRhcmdldFZpZGVvSW5kZXg7XG5cbiAgICAgIGF3YWl0IG1ldGFkYXRhTG9hZGVkO1xuXG4gICAgICBjb25zdCBzZWVrU2Vjb25kcyA9IHJlbGF0aXZlVGltZXN0YW1wIC8gMTAwMDtcbiAgICAgIGNvbnN0IHRhcmdldFRpbWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzZWVrU2Vjb25kcywgdmlkZW8uZHVyYXRpb24gfHwgc2Vla1NlY29uZHMpKTtcbiAgICAgIFxuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3Qgb25TZWVrZWQgPSAoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAxMDApO1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdmlkZW8uYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSB0YXJnZXRUaW1lO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgb25TZWVrZWQpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sYXN0U2V0RHVyYXRpb24gPSBjdW11bGF0aXZlVGltZXN0YW1wO1xuICAgICAgXG4gICAgICBpZiAoTWF0aC5hYnModmlkZW8uY3VycmVudFRpbWUgLSB0YXJnZXRUaW1lKSA+IDAuNSkge1xuICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IHRhcmdldFRpbWU7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGVyLXZpZGVvIHByb2dyZXNzXG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gdmlkZW8uZHVyYXRpb24gKiAxMDAwO1xuICAgICAgaWYgKGR1cmF0aW9uTXMgPiAwKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICh2aWRlby5jdXJyZW50VGltZSAqIDEwMDAgLyBkdXJhdGlvbk1zKSAqIDEwMCkpO1xuICAgICAgfVxuICAgICAgdGhpcy52aWRlb1RpbWVVcGRhdGUuZW1pdChjdW11bGF0aXZlVGltZXN0YW1wKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTaW11bGF0b3JdIHN3aXRjaFRvVmlkZW9BbmRTZWVrIGZhaWxlZDonLCBlcnIpO1xuICAgICAgdGhpcy5wcm9ncmVzcyA9IDA7XG4gICAgICB0aGlzLnZpZGVvVGltZVVwZGF0ZS5lbWl0KGN1bXVsYXRpdmVUaW1lc3RhbXApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBsYXllclN0YXRlID0gJ3BhdXNlZCc7XG4gICAgICB0aGlzLmhpdE1hcmtlcnMuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cImNxYS11aS1yb290XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjRjNGNEY2OyBoZWlnaHQ6IDEwMCU7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCIgICBbbmdTdHlsZV09XCJ7XG4gIHBvc2l0aW9uOiBpc0Z1bGxTY3JlZW4gPyAnZml4ZWQnIDogbnVsbCxcbiAgaW5zZXQ6IGlzRnVsbFNjcmVlbiA/ICcxcmVtJyA6IG51bGwsXG4gIHpJbmRleDogaXNGdWxsU2NyZWVuID8gJzUwJyA6IG51bGwsXG4gIGJveFNoYWRvdzogaXNGdWxsU2NyZWVuID8gJzBweCAxM3B4IDI1cHggLTEycHggcmdiYSgwLCAwLCAwLCAwLjI1KScgOiBudWxsLFxuICBib3JkZXJSYWRpdXM6IGlzRnVsbFNjcmVlbiA/ICcuNXJlbScgOiBudWxsLFxuICBib3JkZXI6IGlzRnVsbFNjcmVlbiA/ICcxcHggc29saWQgI0U1RTdFQicgOiBudWxsLFxuICB3aWR0aDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6IG51bGwsXG4gIGhlaWdodDogaXNGdWxsU2NyZWVuID8gJ2NhbGMoMTAwJSAtIDMycHgpJyA6ICcxMDAlJyxcbiAgb3ZlcmZsb3c6IGlzRnVsbFNjcmVlbiA/ICdoaWRkZW4nIDogbnVsbFxufVwiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtcHktMSBjcWEtcHgtMiBjcWEtYmctWyNGRkZGRkZdXCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgI0U1RTdFQjtib3gtc2hhZG93OiAwcHggMXB4IDJweCAwcHggIzAwMDAwMDBEO1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC13cmFwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMaXZlXCIgY2xhc3M9XCJjcWEtaC1bMjFweF0gY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xLjUgY3FhLW1yLTIgY3FhLXB4LVs5cHhdIGNxYS1weS1bM3B4XSBjcWEtYmctWyNGQ0Q5RDldIGNxYS1yb3VuZGVkLVs2cHhdXCIgc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCAjRjlCRkJGO1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS13LTIgY3FhLWgtMiBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0Y0N0Y3Rl1cIiBzdHlsZT1cImZsZXgtc2hyaW5rOiAwO1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctWyNGNDdGN0ZdIGNxYS1vcGFjaXR5LTc1IGNxYS1hbmltYXRlLXBpbmdcIj48L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bI0M2MzUzNV0gY3FhLWxlYWRpbmctWzE1cHhdXCI+TGl2ZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCNjbGlwMF85MzVfMTU4NDcpXCI+XG4gICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgZD1cIk0wLjYyNSA1QzAuNjI1IDYuMTYwMzIgMS4wODU5NCA3LjI3MzEyIDEuOTA2NDEgOC4wOTM1OUMyLjcyNjg4IDguOTE0MDYgMy44Mzk2OCA5LjM3NSA1IDkuMzc1QzYuMTYwMzIgOS4zNzUgNy4yNzMxMiA4LjkxNDA2IDguMDkzNTkgOC4wOTM1OUM4LjkxNDA2IDcuMjczMTIgOS4zNzUgNi4xNjAzMiA5LjM3NSA1QzkuMzc1IDMuODM5NjggOC45MTQwNiAyLjcyNjg4IDguMDkzNTkgMS45MDY0MUM3LjI3MzEyIDEuMDg1OTQgNi4xNjAzMiAwLjYyNSA1IDAuNjI1QzMuODM5NjggMC42MjUgMi43MjY4OCAxLjA4NTk0IDEuOTA2NDEgMS45MDY0MUMxLjA4NTk0IDIuNzI2ODggMC42MjUgMy44Mzk2OCAwLjYyNSA1WlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuNlwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTMuMTI1IDVDMy4xMjUgMy44Mzk2OCAzLjMyMjU0IDIuNzI2ODggMy42NzQxNyAxLjkwNjQxQzQuMDI1ODEgMS4wODU5NCA0LjUwMjcyIDAuNjI1IDUgMC42MjVDNS40OTcyOCAwLjYyNSA1Ljk3NDE5IDEuMDg1OTQgNi4zMjU4MiAxLjkwNjQxQzYuNjc3NDYgMi43MjY4OCA2Ljg3NSAzLjgzOTY4IDYuODc1IDVDNi44NzUgNi4xNjAzMiA2LjY3NzQ2IDcuMjczMTIgNi4zMjU4MiA4LjA5MzU5QzUuOTc0MTkgOC45MTQwNiA1LjQ5NzI4IDkuMzc1IDUgOS4zNzVDNC41MDI3MiA5LjM3NSA0LjAyNTgxIDguOTE0MDYgMy42NzQxNyA4LjA5MzU5QzMuMzIyNTQgNy4yNzMxMiAzLjEyNSA2LjE2MDMyIDMuMTI1IDVaXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuOTM3NSA2LjQ1ODY2SDkuMDYyNU0wLjkzNzUgMy41NDE5OUg5LjA2MjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC42XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjbGlwMF85MzVfMTU4NDdcIj5cbiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD1cIjEwXCIgaGVpZ2h0PVwiMTBcIiBmaWxsPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnXCIgc3R5bGU9XCJ3aWR0aDogMTBweDsgaGVpZ2h0OiAxMHB4O1wiPlxuICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk03LjA4MzI1IDAuODMzMDA4SDIuOTE2NTlDMi40NTYzNSAwLjgzMzAwOCAyLjA4MzI1IDEuMjA2MSAyLjA4MzI1IDEuNjY2MzRWOC4zMzMwMUMyLjA4MzI1IDguNzkzMjQgMi40NTYzNSA5LjE2NjM0IDIuOTE2NTkgOS4xNjYzNEg3LjA4MzI1QzcuNTQzNDkgOS4xNjYzNCA3LjkxNjU4IDguNzkzMjQgNy45MTY1OCA4LjMzMzAxVjEuNjY2MzRDNy45MTY1OCAxLjIwNjEgNy41NDM0OSAwLjgzMzAwOCA3LjA4MzI1IDAuODMzMDA4WlwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNSA3LjVINS4wMDQxN1wiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1zbSAhY3FhLXRleHQtWzEwcHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbWwtMlwiPlxuICAgICAgICAgIHt7IHBsYXRmb3JtTmFtZSB9fVxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLW1sLTFcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ1NjcmVlbiBzaXplOiAnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoICsgJ3gnICsgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LmhlaWdodFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgwrdcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLW1sLTFcIj5cbiAgICAgICAgICAgICAge3sgZWZmZWN0aXZlQnJvd3NlclZpZXdQb3J0LndpZHRoIH19eHt7IGVmZmVjdGl2ZUJyb3dzZXJWaWV3UG9ydC5oZWlnaHQgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwic2hvd0NhcHR1cmVWaWRlbyAmJiBpc0xpdmVcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5cIlxuICAgICAgICAgIFtjbGFzcy5pcy1sb2FkaW5nXT1cImlzQ2FwdHVyaW5nVmlkZW9cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0NhcHR1cmluZ1ZpZGVvXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2FwdHVyZVZpZGVvKClcIj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0NhcHR1cmluZ1ZpZGVvXCIgY2xhc3M9XCJjYXB0dXJlLXZpZGVvLWJ0bl9fZG90XCI+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNDYXB0dXJpbmdWaWRlb1wiIGNsYXNzPVwiY2FwdHVyZS12aWRlby1idG5fX3NwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+e3sgaXNDYXB0dXJpbmdWaWRlbyA/ICdDYXB0dXJpbmfigKYnIDogJ0NhcHR1cmUgVmlkZW8nIH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc0xpdmVcIiBbbmdDbGFzc109XCJnZXRTdGF0dXNCYWRnZUNsYXNzKClcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJnZXRTdGF0dXNUZXh0Q2xhc3MoKVwiPnt7IGxpdmVTdGF0dXMgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICAgICAgKm5nSWY9XCJpc0xpdmUgJiYgdmlkZW9VcmxzICYmIHZpZGVvVXJscy5sZW5ndGggPiAwXCJcbiAgICAgICAgICBbc2VnbWVudHNdPVwibGl2ZVNlc3Npb25TZWdtZW50c1wiXG4gICAgICAgICAgW3ZhbHVlXT1cImxpdmVTZXNzaW9uVmlld1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTGl2ZVNlc3Npb25WaWV3Q2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMaXZlXCI+XG4gICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgIFtzZWdtZW50c109XCJzZWdtZW50c1wiXG4gICAgICAgICAgICBbdmFsdWVdPVwiY3VycmVudFZpZXdcIlxuICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VnbWVudENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtc2VnbWVudC1jb250cm9sPlxuXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0Z1bGxTY3JlZW5cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1jdXJzb3ItcG9pbnRlciBob3ZlcjpjcWEtYmctZ3JheS0xMDAgY3FhLXJvdW5kZWQtc20gY3FhLXRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsU2NyZWVuKClcIlxuICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBhbmRcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTBcIiBoZWlnaHQ9XCIxMFwiIHZpZXdCb3g9XCIwIDAgMTAgMTBcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMjUgMS4yNUg4Ljc1VjMuNzVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NDk5MiAxLjI1TDUuODMzMjUgNC4xNjY2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDguNzQ5NjdMNC4xNjY2NyA1LjgzMzAxXCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNzUgOC43NUgxLjI1VjYuMjVcIiBzdHJva2U9XCIjOUNBM0FGXCIgc3Ryb2tlLXdpZHRoPVwiMC44MzMzMzNcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Z1bGxTY3JlZW5cIiBcbiAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLXAtMSBjcWEtY3Vyc29yLXBvaW50ZXIgaG92ZXI6Y3FhLWJnLWdyYXktMTAwIGNxYS1yb3VuZGVkLXNtIGNxYS10cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRnVsbFNjcmVlbigpXCJcbiAgICAgICAgICAgICAgIHRpdGxlPVwiRXhpdCBmdWxsIHNjcmVlblwiPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMCAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC43NSA2LjI1SDYuMjVWOC43NVwiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjI1MDA4IDYuMjVMOS4xNjY3NSA5LjE2NjY3XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAuODMzMjUyIDAuODMzMDA4TDMuNzQ5OTIgMy43NDk2N1wiIHN0cm9rZT1cIiM5Q0EzQUZcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0xLjI1IDMuNzVIMy43NVYxLjI1XCIgc3Ryb2tlPVwiIzlDQTNBRlwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1oLVtjYWxjKDEwMCUtNDFweCldXCI+XG4gICAgPCEtLSBGYXN0LWZvcndhcmQgb3ZlcmxheTogY292ZXJzIGNvbnRlbnQgYXJlYSBidXQgbm90IGhlYWRlciAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNGYXN0Rm9yd2FyZGluZyAmJiBmYXN0Rm9yd2FyZENvbmZpZ1wiXG4gICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC02XCJcbiAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI0YzRjRGNjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQteGwgY3FhLXctZnVsbFwiXG4gICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiA1MDBweDsgcGFkZGluZzogMzJweDsgYm94LXNoYWRvdzogMHB4IDI1cHggNTBweCAtMTJweCAjMDAwMDAwNDA7IGJvcmRlcjogMXB4IHNvbGlkICNFNUU1RTVcIj5cbiAgICAgICAgPCEtLSBTcGFya2xlIGF2YXRhciB3aXRoIHJvdGF0aW5nIGFyYyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWItMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmVcIiBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1pbnNldC0wIGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHJnYmEoNjMsNjcsMjM4LDAuMTIpO1wiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjZcIiB2aWV3Qm94PVwiMCAwIDI0IDI2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyLjAyNTEgMEMxMi4xNzMgMC4wNjM0MTIxIDEyLjIzNjIgMC4yMTgyNjQgMTIuMjk2OCAwLjM2MjExQzEyLjMyNzIgMC40NDU5MjMgMTIuMzU1IDAuNTMwMTkyIDEyLjM4MjEgMC42MTUxMzNDMTIuMzkyNyAwLjY0NzY4MiAxMi40MDMzIDAuNjgwMjMxIDEyLjQxNDIgMC43MTM3NjZDMTIuNTU0OCAxLjE1MTc3IDEyLjY4MDEgMS41OTQ0NyAxMi44MDYxIDIuMDM2ODZDMTIuODM0NiAyLjEzNjczIDEyLjg2MzIgMi4yMzY1NiAxMi44OTE4IDIuMzM2MzhDMTMuMDM3NSAyLjg0NDY0IDEzLjE4MjEgMy4zNTMyMSAxMy4zMjU4IDMuODYyMDFDMTMuMzQ2IDMuOTMzNDcgMTMuMzY2MiA0LjAwNDkyIDEzLjM4NjQgNC4wNzYzOEMxMy40NDM0IDQuMjc3ODMgMTMuNTAwMyA0LjQ3OTMgMTMuNTU2OSA0LjY4MDg3QzEzLjY3NjQgNS4xMDY3OCAxMy43OTkzIDUuNTMxNDUgMTMuOTMwMSA1Ljk1NDA1QzEzLjk0MTUgNS45OTEwMiAxMy45NTI5IDYuMDI3OTkgMTMuOTY0NyA2LjA2NjA4QzE0LjMwNDUgNy4xNTMxOCAxNC43ODYyIDguMTI3NTEgMTUuNTc1NyA4Ljk1NzQzQzE1LjU5NTMgOC45NzkgMTUuNjE0OCA5LjAwMDU4IDE1LjYzNSA5LjAyMjgyQzE1Ljk3MiA5LjM4MjQ2IDE2LjQwNDUgOS42NzA2MyAxNi44MzY4IDkuOTAzMjJDMTYuODU4OCA5LjkxNTI2IDE2Ljg4MDggOS45MjcyOSAxNi45MDM1IDkuOTM5N0MxOC4xNzU3IDEwLjYyMzEgMTkuNzA1MyAxMC45MjM3IDIxLjA4MzIgMTEuMzIzOEMyMS42ODY5IDExLjQ5OTIgMjIuMjg4OCAxMS42ODAyIDIyLjg4ODUgMTEuODY5MUMyMi45MzA2IDExLjg4MjMgMjIuOTcyNyAxMS44OTU2IDIzLjAxNDkgMTEuOTA4OEMyMy4xNDA5IDExLjk0ODMgMjMuMjY2NyAxMS45ODg1IDIzLjM5MjMgMTIuMDI5M0MyMy40MjE2IDEyLjAzODUgMjMuNDUwOSAxMi4wNDc4IDIzLjQ4MSAxMi4wNTczQzIzLjY1NDEgMTIuMTE0NiAyMy44MTk3IDEyLjE4MjEgMjMuOTYxOCAxMi4yOTkyQzI0LjAwNTEgMTIuMzkzOCAyNC4wMDUxIDEyLjM5MzggMjMuOTkzMyAxMi40ODg0QzIzLjg1NSAxMi42MjU4IDIzLjcxNzkgMTIuNjkwMiAyMy41MzU0IDEyLjc1M0MyMy41MDkzIDEyLjc2MjMgMjMuNDgzMiAxMi43NzE2IDIzLjQ1NjQgMTIuNzgxMUMyMy4xNDgzIDEyLjg4OTIgMjIuODM2IDEyLjk4MzggMjIuNTIzNCAxMy4wNzc1QzIyLjQ1OTIgMTMuMDk2OSAyMi4zOTUgMTMuMTE2MyAyMi4zMzA5IDEzLjEzNTdDMjEuOTM1MiAxMy4yNTUxIDIxLjUzODkgMTMuMzcxOSAyMS4xNDIxIDEzLjQ4NzRDMjAuNjE5NSAxMy42Mzk1IDIwLjA5NzcgMTMuNzk0MiAxOS41NzYzIDEzLjk1MDZDMTkuNDkwOSAxMy45NzYzIDE5LjQwNTUgMTQuMDAxOCAxOS4zMiAxNC4wMjcyQzE4Ljg3MTIgMTQuMTYxIDE4LjQyNDYgMTQuMjk5NSAxNy45ODE3IDE0LjQ1MTZDMTcuOTQ1IDE0LjQ2NDIgMTcuOTA4MiAxNC40NzY4IDE3Ljg3MDQgMTQuNDg5N0MxNi4zODcgMTUuMDA1OSAxNS4yNTYzIDE1Ljk2ODcgMTQuNTQ4NiAxNy4zNzY4QzE0LjE2NyAxOC4xNjgxIDEzLjk0MTkgMTkuMDIzOSAxMy43MTI0IDE5Ljg2ODVDMTMuNjUwMyAyMC4wOTY0IDEzLjU4NDIgMjAuMzIzIDEzLjUxNzUgMjAuNTQ5NkMxMy40NjUxIDIwLjcyNzggMTMuNDEzOSAyMC45MDY0IDEzLjM2NCAyMS4wODUzQzEzLjM1OCAyMS4xMDY2IDEzLjM1MjEgMjEuMTI3OSAxMy4zNDYgMjEuMTQ5OUMxMy4zMTcyIDIxLjI1MyAxMy4yODg1IDIxLjM1NjIgMTMuMjYgMjEuNDU5NEMxMy4xODcyIDIxLjcyMTEgMTMuMTA4NyAyMS45ODA3IDEzLjAyODEgMjIuMjQwMUMxMi44ODUxIDIyLjcwMTIgMTIuNzU0OSAyMy4xNjU2IDEyLjYyNTYgMjMuNjMwNkMxMi40MzA1IDI0LjMzMDggMTIuNDMwNSAyNC4zMzA4IDEyLjMxOTkgMjQuNjY3NEMxMi4zMTI2IDI0LjY5IDEyLjMwNTIgMjQuNzEyNiAxMi4yOTc3IDI0LjczNTlDMTIuMjU3MyAyNC44NTU3IDEyLjIxNTggMjQuOTY2IDEyLjEzOTQgMjUuMDY3NEMxMi4wMjMxIDI1LjA5MyAxMi4wMjMxIDI1LjA5MyAxMS45MTg3IDI1LjA5ODlDMTEuNzk5MyAyNC45MjQ5IDExLjcyMDIgMjQuNzU2MiAxMS42NTY5IDI0LjU1NTNDMTEuNjQ3NiAyNC41MjY5IDExLjYzODQgMjQuNDk4NCAxMS42Mjg5IDI0LjQ2OTFDMTEuNTExNiAyNC4xMDE5IDExLjQwNjcgMjMuNzMwOSAxMS4zMDE4IDIzLjM2QzExLjI3NzggMjMuMjc1MiAxMS4yNTM2IDIzLjE5MDQgMTEuMjI5NSAyMy4xMDU2QzExLjA0OTYgMjIuNDczNyAxMC44NzI3IDIxLjg0MDkgMTAuNjk2IDIxLjIwODFDOS45NjAxOSAxOC4wNzc1IDkuOTYwMTkgMTguMDc3NSA4LjEwNCAxNS41NDY0QzguMDc0MjUgMTUuNTIyMiA4LjA0NDUgMTUuNDk3OSA4LjAxMzg1IDE1LjQ3MjlDNi43OTc2NyAxNC40OTg5IDUuMTk1NTYgMTQuMTM4MiAzLjcyODQgMTMuNzE1NUMzLjM2NTUzIDEzLjYxMDkgMy4wMDI4IDEzLjUwNTggMi42NDAwOSAxMy40MDA3QzIuNjA4MzcgMTMuMzkxNSAyLjYwODM3IDEzLjM5MTUgMi41NzYwMSAxMy4zODIxQzIuMDUyODMgMTMuMjMwNCAxLjUyOTggMTMuMDc4MyAxLjAwODYgMTIuOTE5OUMwLjk4NjU0OSAxMi45MTMyIDAuOTY0NSAxMi45MDY2IDAuOTQxNzgzIDEyLjg5OTdDMC4xNDEwNjQgMTIuNjU3OCAwLjE0MTA2NCAxMi42NTc4IDAuMDAxNzI0MSAxMi40ODg0Qy0wLjAwMjIxNjcgMTIuNDExNSAtMC4wMDIyMTY3IDEyLjQxMTUgMC4wMzMyNTA1IDEyLjMzMDdDMC4xNzg4ODkgMTIuMTg4IDAuMzIwMjA1IDEyLjEyNjkgMC41MTI0MjYgMTIuMDY0N0MwLjU0MDI1OSAxMi4wNTU0IDAuNTY4MDkgMTIuMDQ2IDAuNTk2NzY2IDEyLjAzNjRDMC42ODIwMDggMTIuMDA3OSAwLjc2NzQzNiAxMS45ODAxIDAuODUyOTM2IDExLjk1MjRDMC44NzczMzUgMTEuOTQ0NCAwLjkwMTczNSAxMS45MzY0IDAuOTI2ODc0IDExLjkyODJDMS4wOTk0MyAxMS44NzE2IDEuMjcyNiAxMS44MTcxIDEuNDQ2MDMgMTEuNzYzM0MxLjQ4ODY0IDExLjc1IDEuNDg4NjQgMTEuNzUgMS41MzIxMiAxMS43MzY0QzIuMjcyNzIgMTEuNTA2MSAzLjAxODE1IDExLjI5MTcgMy43NjMzNiAxMS4wNzY5QzQuMzE4NjYgMTAuOTE2OCA0Ljg3MzAyIDEwLjc1NCA1LjQyNTYxIDEwLjU4NDdDNS40NTEgMTAuNTc3IDUuNDc2NCAxMC41NjkyIDUuNTAyNTYgMTAuNTYxM0M2Ljc4MjY3IDEwLjE3MDUgOC4wMzQwOSA5LjYxNjEyIDguODYwNjMgOC41MTYwNkM4Ljg3MyA4LjQ5OTc0IDguODg1MzggOC40ODM0MiA4Ljg5ODEzIDguNDY2NjFDOS44MTg2IDcuMjQ1NjQgMTAuMTc3NSA1Ljc2MDgyIDEwLjU3ODUgNC4zMTIwMUMxMC43MTA1IDMuODM1NTIgMTAuODQ0IDMuMzU5NDcgMTAuOTc3OSAyLjg4MzU2QzExLjAxNSAyLjc1MTc3IDExLjA1MjEgMi42MTk5NyAxMS4wODkgMi40ODgxMkMxMS4yMzcyIDEuOTU4NTIgMTEuMzg3NiAxLjQyOTY0IDExLjU0NjcgMC45MDMxODFDMTEuNTYxNiAwLjg1Mzg4MiAxMS41NzY0IDAuODA0NTYxIDExLjU5MTEgMC43NTUyMThDMTEuODEzOCAwLjAxMTEyMDUgMTEuODEzOCAwLjAxMTEyMDUgMTIuMDI1MSAwWlwiIGZpbGw9XCIjM0Y0M0VFXCIvPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTkuMjk2MiAxLjU0ODk5QzE5LjQ0MSAxLjcxMjggMTkuNDY5OSAxLjkwNTMyIDE5LjUxNSAyLjExNDQ5QzE5LjY2NTMgMi43NzE2MSAxOS44Mzg0IDMuMzc1ODQgMjAuNDM5NCAzLjc1NzU2QzIwLjgxMDIgMy45NjI2MyAyMS4yNTIyIDQuMDU1OTUgMjEuNjYzIDQuMTQ0MDlDMjEuODM2NCA0LjE4MjA1IDIxLjk4MjkgNC4yMzI0MiAyMi4xMzE2IDQuMzMzMTZDMjIuMTY1MSA0LjM4NjM2IDIyLjE2NTEgNC4zODYzNiAyMi4xNjMyIDQuNDc4OTdDMjIuMTI4NyA0LjU5MTU5IDIyLjA5ODQgNC42Mjc5MSAyMi4wMDc1IDQuNzAxNjNDMjEuOTA4MSA0LjczNDg4IDIxLjkwODEgNC43MzQ4OCAyMS43ODg4IDQuNzYwNzRDMjEuNzQzNyA0Ljc3MTEgMjEuNjk4NSA0Ljc4MTU4IDIxLjY1MzUgNC43OTIxNEMyMS42MjkzIDQuNzk3NzQgMjEuNjA1MSA0LjgwMzM1IDIxLjU4MDMgNC44MDkxMkMyMC44NDU2IDQuOTc5MDcgMjAuODQ1NiA0Ljk3OTA3IDIwLjIxMDUgNS4zNjM2OEMyMC4xODk5IDUuMzgwMyAyMC4xNjkyIDUuMzk2OTIgMjAuMTQ3OSA1LjQxNDA1QzE5LjY5NDEgNS44MTQyNiAxOS41OTgxIDYuNDggMTkuNDYxNSA3LjAzNzdDMTkuNDUzNiA3LjA2ODMzIDE5LjQ0NTggNy4wOTg5NiAxOS40Mzc3IDcuMTMwNTFDMTkuNDMxIDcuMTU3NjIgMTkuNDI0MiA3LjE4NDc0IDE5LjQxNzIgNy4yMTI2N0MxOS4zODc3IDcuMjk1NDYgMTkuMzU3MiA3LjM0OTQ1IDE5LjI5NjIgNy40MTI4OUMxOS4xMjY2IDcuNDM0NDQgMTkuMTI2NiA3LjQzNDQ0IDE5LjA0NCA3LjQxMjg5QzE4LjkxMjggNy4zMTExNCAxOC44ODM0IDcuMTk1MjQgMTguODQ5MSA3LjAzOTVDMTguODQzMyA3LjAxNTM5IDE4LjgzNzYgNi45OTEyNyAxOC44MzE3IDYuOTY2NDJDMTguODEzNCA2Ljg4OTQgMTguNzk1NiA2LjgxMjI2IDE4Ljc3OCA2LjczNTA4QzE4LjYzOTggNi4xMzQwMyAxOC40ODM3IDUuNTQ0MzIgMTcuOTMyNCA1LjE5MjAxQzE3LjUwMTUgNC45NTE3MiAxNi45Nzc2IDQuODM4MDggMTYuNDk2IDQuNzQ2MzFDMTYuMzY0IDQuNzE4ODMgMTYuMjg4NCA0LjY4NDI3IDE2LjIwNjcgNC41NzU1MkMxNi4xODg5IDQuNDY1MTggMTYuMTg4OSA0LjQ2NTE4IDE2LjIwNjcgNC4zNTQ4NEMxNi4zMzIyIDQuMjI0ODQgMTYuNDY0NCA0LjE5MzExIDE2LjYzNDIgNC4xNTM4NkMxNi42ODc3IDQuMTQwNjEgMTYuNzQxMiA0LjEyNzI2IDE2Ljc5NDcgNC4xMTM4M0MxNi44MjIzIDQuMTA2OTQgMTYuODUgNC4xMDAwNCAxNi44Nzg0IDQuMDkyOTRDMTcuMDE5MyA0LjA1NjY4IDE3LjE1ODggNC4wMTYwMiAxNy4yOTgzIDMuOTc0NTVDMTcuMzIzNiAzLjk2NzIgMTcuMzQ4OSAzLjk1OTg1IDE3LjM3NTEgMy45NTIyN0MxNy42NTg1IDMuODY3NTIgMTcuOTAzMiAzLjc1OTExIDE4LjEyOTggMy41NjY2OEMxOC4xNTA5IDMuNTQ5MjggMTguMTcyIDMuNTMxODkgMTguMTkzOCAzLjUxMzk3QzE4LjU0NjUgMy4xOTY1OCAxOC42NjYzIDIuNzE5NzYgMTguNzc1MSAyLjI3NDg0QzE4Ljc4MzQgMi4yNDEwNiAxOC43OTE2IDIuMjA3MjggMTguODAwMiAyLjE3MjQ4QzE4LjgxNjcgMi4xMDQ2MyAxOC44MzI5IDIuMDM2NyAxOC44NDg4IDEuOTY4N0MxOC44NjAyIDEuOTIxMzkgMTguODYwMiAxLjkyMTM5IDE4Ljg3MTcgMS44NzMxMkMxOC44Nzg0IDEuODQ0ODYgMTguODg1IDEuODE2NTkgMTguODkxOCAxLjc4NzQ3QzE4LjkyMDkgMS42OTc0OSAxOC45NTkgMS42MjY4MyAxOS4wMTI1IDEuNTQ4OTlDMTkuMTE1MyAxLjQ5NzYxIDE5LjE4NzQgMS41MjA4NCAxOS4yOTYyIDEuNTQ4OTlaXCIgZmlsbD1cIiMwRjEyQThcIi8+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk00Ljc4ODEgMTcuNDIxOUM0LjgyNTYxIDE3LjQyMjIgNC44MjU2MSAxNy40MjIyIDQuODYzODcgMTcuNDIyNUM1LjEzMjk2IDE3LjQzMDcgNS4zMTUwMyAxNy41MTY5IDUuNTEzMjEgMTcuNjk3OEM1Ljc0MzgxIDE3Ljk0NjkgNS44NTAyOSAxOC4yMjc5IDUuODQ0MjMgMTguNTYzN0M1LjgxODMzIDE4LjgzNTkgNS42NTc3OSAxOS4wNzM2IDUuNDYwODcgMTkuMjU3NkM1LjIyOTA4IDE5LjQ0NDcgNC45OTUyNSAxOS41MDY1IDQuNjk5MDYgMTkuNDk3OUM0LjQ0OTMzIDE5LjQ2ODggNC4yMTQzOCAxOS4zNTAyIDQuMDM3MzggMTkuMTcxN0MzLjgxNzI2IDE4Ljg3MTMgMy43NTI5MSAxOC41OTU4IDMuNzg1MTcgMTguMjI1OUMzLjg1MTggMTcuOTM0NiA0LjA0MzkgMTcuNjk4MSA0LjI4OTU5IDE3LjUzMjNDNC40NjAyNyAxNy40NDU4IDQuNTk3NTUgMTcuNDIwMyA0Ljc4ODEgMTcuNDIxOVpcIiBmaWxsPVwiIzEyMTZDQ1wiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNxYS1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgIHdpZHRoPVwiNjBcIiBoZWlnaHQ9XCI2MFwiIHZpZXdCb3g9XCIwIDAgNjAgNjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICBzdHlsZT1cInRvcDogLTJweDsgbGVmdDogLTJweDtcIj5cbiAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIHN0cm9rZT1cIiNFMkUyRTNcIiBzdHJva2Utd2lkdGg9XCIyXCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWZmLXNwaW5cIlxuICAgICAgICAgICAgICAgICB3aWR0aD1cIjYwXCIgaGVpZ2h0PVwiNjBcIiB2aWV3Qm94PVwiMCAwIDYwIDYwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgc3R5bGU9XCJ0b3A6IC0ycHg7IGxlZnQ6IC0ycHg7IHRyYW5zZm9ybS1vcmlnaW46IDMwcHggMzBweDtcIj5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk0zMCAyIEEgMjggMjggMCAwIDEgNTQuMjQgNDRcIlxuICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjM2Y0M2VlXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBmaWxsPVwibm9uZVwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtbS0wIGNxYS1tYi0yXCJcbiAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjMTYxNjE3O1wiPlxuICAgICAgICAgIEZhc3QtZm9yd2FyZGluZyB0byB5b3VyIHN0ZXBcbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtY2VudGVyIGNxYS1tLTBcIlxuICAgICAgICAgICBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM2RDZENzQ7XCI+XG4gICAgICAgICAgU3RlcHMge3sgZmFzdEZvcndhcmRDb25maWcuZnJvbVN0ZXAgfX3igJN7eyBmYXN0Rm9yd2FyZENvbmZpZy50b1N0ZXAgfX0gYXJlIHJ1bm5pbmcgYXQgZnVsbCBzcGVlZCBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICAgICAgICA8c3Ryb25nIHN0eWxlPVwiY29sb3I6ICM2RDZENzQ7IGZvbnQtd2VpZ2h0OiA2MDA7XCI+TGl2ZSB2aWV3IGFuZCBzY3JlZW5zaG90cyBhcmUgcGF1c2VkPC9zdHJvbmc+XG4gICAgICAgICAgdW50aWwgZXhlY3V0aW9uIHJlYWNoZXMgeW91ciB0YXJnZXQgc3RlcCDigJQgdGhlbiB5b3UncmUgaW4gYXV0b21hdGljYWxseS5cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNiBjcWEtbWItNVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLW1iLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzRDNEM1MTtcIj5TdGVwcyBleGVjdXRpbmcgaW4gYmFja2dyb3VuZDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4OyBjb2xvcjogIzZENkQ3NDtcIj5cbiAgICAgICAgICAgICAge3sgZmFzdEZvcndhcmRDb25maWcuY3VycmVudFN0ZXAgfX0gb2Yge3sgZmFzdEZvcndhcmRDb25maWcudG90YWxTdGVwcyB9fSBzdGVwc1xuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDZweDsgYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMzsgYm9yZGVyLXJhZGl1czogOTk5OXB4OyBvdmVyZmxvdzogaGlkZGVuO1wiPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGguJV09XCJmYXN0Rm9yd2FyZFByb2dyZXNzUGVyY2VudFwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsICMzRjQzRUUgMCUsICM4MThDRjggMTAwJSk7IHRyYW5zaXRpb246IHdpZHRoIDMwMG1zIGN1YmljLWJlemllcigwLjQsMCwwLjIsMSk7XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiXG4gICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJhY2tncm91bmQ6ICM2MzY2RjExQTsgYm9yZGVyOiAxcHggc29saWQgIzYzNjZGMTMzO1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgc3R5bGU9XCJmbGV4LXNocmluazogMDtcIj5cbiAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI4XCIgY3k9XCI4XCIgcj1cIjYuNVwiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiM1wiIHN0cm9rZT1cIiMzZjQzZWVcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjhcIiBjeT1cIjhcIiByPVwiMVwiIGZpbGw9XCIjM2Y0M2VlXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEycHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNkQ2RDc0O1wiPkp1bXBpbmcgdG88L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjM0Y0M0VFOyBmb250LXdlaWdodDogNDAwOyBkaXNwbGF5OiBibG9jaztcIj5cbiAgICAgICAgICAgICAgU3RlcCB7eyBmYXN0Rm9yd2FyZENvbmZpZy50YXJnZXRTdGVwTnVtYmVyIH19IOKAlCA8c3BhbiBbaW5uZXJIVE1MXT1cImZhc3RGb3J3YXJkQ29uZmlnLnRhcmdldFN0ZXBMYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8IS0tIExpdmUgQ29udGVudCBWaWV3IC0tPlxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiBpc0xpdmUgJiYgbGl2ZVNlc3Npb25WaWV3ID09PSAnbGl2ZSdcIiBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLW92ZXJmbG93LWhpZGRlblwiXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgJ2NxYS13LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1mbGV4LWNvbCc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICdjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAnY3FhLW1heC1oLWZ1bGwgY3FhLWgtZnVsbCc6IGhhc0RldmljZUZyYW1lICYmIChlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJyB8fCAhaXNMaXZlKSxcbiAgICAgICAgICAgICAgICdjcWEtbWluLXctbWF4JzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ1xuICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImxpdmVDb250ZW50Q29udGFpbmVyU3R5bGVcIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiaGFzRGV2aWNlRnJhbWVcIlxuICAgICAgICAgICAgW3NyY109XCJkZXZpY2VNb2NrdXBJbWFnZVwiXG4gICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICdjcWEtYWJzb2x1dGUgY3FhLWZsZXggY3FhLWZsZXgtY29sJzogaGFzRGV2aWNlRnJhbWUsXG4gICAgICAgICAgICAgICAgICdjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZSc6ICFoYXNEZXZpY2VGcmFtZSxcbiAgICAgICAgICAgICAgICAgJ2NxYS16LTIwJzogaGFzRGV2aWNlRnJhbWUgJiYgZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsXG4gICAgICAgICAgICAgICAgICdjcWEtYmctd2hpdGUnOiBoYXNEZXZpY2VGcmFtZSAmJiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ1xuICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICBbbmdTdHlsZV09XCJoYXNEZXZpY2VGcmFtZSA/IGRldmljZVNjcmVlblN0eWxlIDoge31cIj5cbiAgICAgICAgICAgIDwhLS0gTG9hZGluZyBTdGF0ZSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbnRlbnRWaWRlb0xvYWRpbmdcIiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTRcIj5cbiAgICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBkaWFtZXRlcj1cIjQwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj57eyBsaXZlTG9hZGluZ0xhYmVsIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gTGl2ZSBDb250ZW50ICh3aGVuIG5vdCBsb2FkaW5nKSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNDb250ZW50VmlkZW9Mb2FkaW5nXCIgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1yZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGl2ZVN0YXR1cyA9PT0gJ0ZhaWxlZCcgJiYgZmFpbGVkU3RhdHVzTWVzc2FnZVwiIGNsYXNzPVwiY3FhLXAtNiBjcWEtdGV4dC1jZW50ZXIgY3FhLXctZnVsbFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB4LTQgY3FhLXB5LTMgY3FhLWJnLVsjRkNEOUQ5XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItWyNGOUJGQkZdIGNxYS1yb3VuZGVkLWxnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3R5bGU9XCJ3aWR0aDogMThweDsgaGVpZ2h0OiAxOHB4OyBjb2xvcjogI0M2MzUzNTsgZm9udC1zaXplOiAxOHB4O1wiPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWyNDNjM1MzVdIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtbS0wXCI+e3sgZmFpbGVkU3RhdHVzTWVzc2FnZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxuZy1jb250ZW50ICpuZ0lmPVwibGl2ZVN0YXR1cyAhPT0gJ0ZhaWxlZCcgfHwgIWZhaWxlZFN0YXR1c01lc3NhZ2VcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gVmlkZW8gVmlldzogcG9zdC1leGVjdXRpb24gVmlkZW8gdGFiLCBvciBtaWQtc2Vzc2lvbiBDYXB0dXJlZCB2aWV3IGluc2lkZSBhIGxpdmUgc2Vzc2lvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgKCghaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAndmlkZW8nKSB8fCAoaXNMaXZlICYmIGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJykpXCJcbiAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2xcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgYXJpYS1sYWJlbD1cIlZpZGVvIHBsYXliYWNrXCJcbiAgICAgICAgIChrZXlkb3duKT1cIm9uVmlkZW9LZXlkb3duKCRldmVudClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cImN1cnJlbnRWaWRlb1VybFwiIFtuZ0NsYXNzXT1cInsnIWNxYS1oLWZ1bGwnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdkZXZpY2UnLCAnY3FhLW10LWF1dG8nOiBoYXNEZXZpY2VGcmFtZSwgJ2NxYS1tYXgtaC1bY2FsYygxMDAlLTEwOHB4KV0nOiBzaG93VmlkZW9MaWJyYXJ5LCAnY3FhLW1heC1oLVtjYWxjKDEwMCUtNjBweCldJzogIXNob3dWaWRlb0xpYnJhcnl9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEZXZpY2VGcmFtZTsgZWxzZSB2aWRlb05vRnJhbWVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1tYXgtaC1mdWxsXCIgW25nQ2xhc3NdPVwieydjcWEtcm91bmRlZC1tZCBjcWEtb3ZlcmZsb3ctaGlkZGVuJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnYnJvd3NlcicsICdjcWEtbWluLXctbWF4JzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIj5cbiAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIFtzcmNdPVwiZGV2aWNlTW9ja3VwSW1hZ2VcIlxuICAgICAgICAgICAgICAgIGFsdD1cIkRldmljZSBtb2NrdXBcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtdy1hdXRvIGNxYS1tYXgtaC1mdWxsIGNxYS1vYmplY3QtY29udGFpbiBjcWEtYmxvY2sgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXotMTBcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIFtuZ1N0eWxlXT1cImRldmljZVNjcmVlblN0eWxlXCIgW25nQ2xhc3NdPVwieydjcWEtYmctd2hpdGUnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgIT09ICdicm93c2VyJ31cIj5cbiAgICAgICAgICAgICAgICA8dmlkZW9cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXZpZGVvUmVmcmVzaGluZ1wiXG4gICAgICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtb2JqZWN0LWNvdmVyIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl0gY3FhLWN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY3VycmVudFZpZGVvVXJsXCJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLXotMjAnOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJ31cIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChjYW5wbGF5KT1cIm9uVmlkZW9DYW5QbGF5KClcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cIm9uVmlkZW9FbmRlZCgpXCJcbiAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICAgICAgPjwvdmlkZW8+XG4gICAgICAgICAgICAgICAgPCEtLSBQbGF5L1BhdXNlIG92ZXJsYXkgaWNvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0zMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7YW5pbWF0aW9uOiAnY3FhRmFkZU91dCA1MDBtcyBlYXNlLW91dCBmb3J3YXJkcyd9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJvdW5kZWQtZnVsbCBjcWEtYmctYmxhY2sgY3FhLWJnLW9wYWNpdHktNTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUsMyAxOSwxMiA1LDIxXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhaXNQbGF5aW5nXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICN2aWRlb05vRnJhbWU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uVmlkZW9GcmFtZUNsaWNrKClcIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICAqbmdJZj1cIiF2aWRlb1JlZnJlc2hpbmdcIlxuICAgICAgICAgICAgICAjdnBsYXllclxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgICBbc3JjXT1cImN1cnJlbnRWaWRlb1VybFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJ2aWRlby93ZWJtXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uVmlkZW9NZXRhZGF0YUxvYWRlZCgpXCJcbiAgICAgICAgICAgICAgKGNhbnBsYXkpPVwib25WaWRlb0NhblBsYXkoKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJvblZpZGVvRW5kZWQoKVwiXG4gICAgICAgICAgICAgIChlcnJvcik9XCJvblZpZGVvRXJyb3IoKVwiXG4gICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgIDwhLS0gUGxheS9QYXVzZSBvdmVybGF5IGljb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BsYXlQYXVzZU92ZXJsYXlcIlxuICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInthbmltYXRpb246ICdjcWFGYWRlT3V0IDUwMG1zIGVhc2Utb3V0IGZvcndhcmRzJ31cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJnLWJsYWNrIGNxYS1iZy1vcGFjaXR5LTUwIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiA1NnB4OyBoZWlnaHQ6IDU2cHg7XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDMgMTksMTIgNSwyMVwiIC8+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1BsYXlpbmdcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjVcIiB5PVwiM1wiIHdpZHRoPVwiNFwiIGhlaWdodD1cIjE4XCIgLz5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIxNVwiIHk9XCIzXCIgd2lkdGg9XCI0XCIgaGVpZ2h0PVwiMThcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiFjdXJyZW50VmlkZW9VcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVk5DU2Vzc2lvbkludHJ1cHB0ZWQgJiYgdm5jU2Vzc2lvbkludHVwcHRlZE1lc3NhZ2U7IGVsc2Ugbm9WaWRlb0RlZmF1bHRcIj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICB7eyB2bmNTZXNzaW9uSW50dXBwdGVkTWVzc2FnZSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9WaWRlb0RlZmF1bHQ+XG4gICAgICAgICAgPHNwYW4+Tm8gdmlkZW8gcmVjb3JkaW5nIGZvdW5kPC9zcGFuPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8IS0tIFZpZGVvIExpYnJhcnkgUGFuZWwg4oCUIHJlc2VydmVzIG9ubHkgaGVhZGVyLWhlaWdodCBpbiBmbG93OyB0aGUgaW5uZXIgcGFuZWwgaXMgYWJzb2x1dGVseSBhbmNob3JlZCB0byBpdHMgYm90dG9tIGVkZ2UsIHNvIHRoZSBib2R5IGV4cGFuZGluZyBtYWtlcyB0aGUgcGFuZWwgZ3JvdyBVUFdBUkQgb3ZlciB0aGUgdmlkZW8uIFRpbWVsaW5lIHN0YXlzIHB1dC4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICBjbGFzcz1cInZpZGVvLWxpYnJhcnlcIlxuICAgICAgICAgICBbY2xhc3MudmlkZW8tbGlicmFyeS0tb3Blbl09XCIhaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIlxuICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tdC1hdXRvJzogaGFzRGV2aWNlRnJhbWV9XCI+XG4gICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2lubmVyXCI+XG4gICAgICAgIDwhLS0gSGVhZGVyIOKAlCBhbHdheXMgdmlzaWJsZSwgY2xpY2tpbmcgdGhlIGNoZXZyb24gdG9nZ2xlcyB0aGUgYm9keSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2hlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1saWJyYXJ5X190aXRsZS1ncm91cFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwidmlkZW8tbGlicmFyeV9faWNvblwiPlxuICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMzMzOTggNy41ODMwOEwxMi4zODA3IDkuNjE0MjVDMTIuNDI0NyA5LjY0MzQ4IDEyLjQ3NTcgOS42NjAyNCAxMi41Mjg0IDkuNjYyNzZDMTIuNTgxMSA5LjY2NTI4IDEyLjYzMzUgOS42NTM0NyAxMi42OCA5LjYyODU2QzEyLjcyNjUgOS42MDM2NiAxMi43NjU0IDkuNTY2NjEgMTIuNzkyNSA5LjUyMTM2QzEyLjgxOTYgOS40NzYxIDEyLjgzNCA5LjQyNDM0IDEyLjgzNCA5LjM3MTU4VjQuNTkwNThDMTIuODM0IDQuNTM5MjYgMTIuODIwNSA0LjQ4ODg1IDEyLjc5NDggNC40NDQ0M0MxMi43NjkxIDQuNDAwMDEgMTIuNzMyMSA0LjM2MzE1IDEyLjY4NzYgNC4zMzc1OUMxMi42NDMxIDQuMzEyMDMgMTIuNTkyNiA0LjI5ODY2IDEyLjU0MTMgNC4yOTg4M0MxMi40OSA0LjI5OSAxMi40Mzk2IDQuMzEyNzIgMTIuMzk1MyA0LjMzODU4TDkuMzMzOTggNi4xMjQ3NVwiIHN0cm9rZT1cIiMzRjQzRUVcIiBzdHJva2Utd2lkdGg9XCIwLjgzMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTY2MDIgMy41SDIuMzMyNjhDMS42ODgzNSAzLjUgMS4xNjYwMiA0LjAyMjMzIDEuMTY2MDIgNC42NjY2N1Y5LjMzMzMzQzEuMTY2MDIgOS45Nzc2NyAxLjY4ODM1IDEwLjUgMi4zMzI2OCAxMC41SDguMTY2MDJDOC44MTAzNSAxMC41IDkuMzMyNjggOS45Nzc2NyA5LjMzMjY4IDkuMzMzMzNWNC42NjY2N0M5LjMzMjY4IDQuMDIyMzMgOC44MTAzNSAzLjUgOC4xNjYwMiAzLjVaXCIgc3Ryb2tlPVwiIzNGNDNFRVwiIHN0cm9rZS13aWR0aD1cIjAuODMzMzMzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlkZW8tbGlicmFyeV9fdGl0bGVcIj5WaWRlbyBMaWJyYXJ5PC9zcGFuPlxuICAgICAgICAgICAgPGNxYS1iYWRnZVxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBpbmxpbmVTdHlsZXM9XCJtaW4td2lkdGg6IG1heC1jb250ZW50O1wiXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcj1cIiNFREU5RkVcIlxuICAgICAgICAgICAgICB0ZXh0Q29sb3I9XCIjNkQyOEQ5XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInZpZGVvVXJscy5sZW5ndGggKyAnIGNsaXAnICsgKHZpZGVvVXJscy5sZW5ndGggPT09IDEgPyAnJyA6ICdzJylcIj5cbiAgICAgICAgICAgIDwvY3FhLWJhZGdlPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aWRlby1saWJyYXJ5X19zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJpc1ZpZGVvRnVsbE1vZGUgPyAnUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ0VhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZSdcIlxuICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIj57eyBpc1ZpZGVvRnVsbE1vZGUgPyAnwrcgUGxheWluZyBhbGwgY2xpcHMgYXMgb25lIGNvbnRpbnVvdXMgdmlkZW8nIDogJ8K3IEVhY2ggY2xpcCBjb3ZlcnMgZXhlY3V0aW9uIHNpbmNlIGxhc3QgY2FwdHVyZScgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2FjdGlvbnNcIj5cbiAgICAgICAgICAgIDxjcWEtYnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJmaWxsZWRcIlxuICAgICAgICAgICAgICBidG5TaXplPVwibWRcIlxuICAgICAgICAgICAgICBpY29uPVwicGxheV9hcnJvd1wiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIlNob3cgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uU2hvd0Z1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8Y3FhLWJ1dHRvblxuICAgICAgICAgICAgICAqbmdJZj1cImlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgICAgIGJ0blNpemU9XCJtZFwiXG4gICAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAgIGljb25Qb3NpdGlvbj1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgdGV4dD1cIkV4aXQgRnVsbCBWaWRlb1wiXG4gICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uRXhpdEZ1bGxWaWRlbygpXCI+XG4gICAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2NvbGxhcHNlXCIgKGNsaWNrKT1cInRvZ2dsZVZpZGVvTGlicmFyeUNvbGxhcHNlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZCA/ICdTaG93IHZpZGVvIGxpYnJhcnknIDogJ0hpZGUgdmlkZW8gbGlicmFyeSdcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDEyIDEyXCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgNy41TDYgNC41TDkgNy41XCIgc3Ryb2tlPVwiIzZCNzI4MFwiIHN0cm9rZS13aWR0aD1cIjEuMjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0zIDQuNUw2IDcuNUw5IDQuNVwiIHN0cm9rZT1cIiM2QjcyODBcIiBzdHJva2Utd2lkdGg9XCIxLjI1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEJvZHkgKGNhcmRzKSDigJQgbWF4LWhlaWdodCBhbmltYXRlcyBmcm9tIDAgKGNvbGxhcHNlZCkgdG8gYSBmaXhlZCBoZWlnaHQgKG9wZW4pLiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpZGVvLWxpYnJhcnlfX2JvZHlcIlxuICAgICAgICAgICAgIFtjbGFzcy52aWRlby1saWJyYXJ5X19ib2R5LS1vcGVuXT1cIiFpc1ZpZGVvTGlicmFyeUNvbGxhcHNlZFwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXNWaWRlb0xpYnJhcnlDb2xsYXBzZWQgPyB0cnVlIDogbnVsbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwcy1yb3dcIlxuICAgICAgICAgICAgICAgI2NsaXBzU2Nyb2xsZXJcbiAgICAgICAgICAgICAgIFtjbGFzcy5jbGlwcy1yb3ctLWRyYWdnaW5nXT1cImNsaXBzRHJhZ0FjdGl2ZVwiXG4gICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ2xpcHNNb3VzZURvd24oJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2xpcHNNb3VzZU1vdmUoJGV2ZW50LCBjbGlwc1Njcm9sbGVyKVwiXG4gICAgICAgICAgICAgICAobW91c2V1cCk9XCJvbkNsaXBzTW91c2VVcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uQ2xpcHNNb3VzZUxlYXZlKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHVybCBvZiB2aWRlb1VybHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrTGlicmFyeUNsaXBCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWNhcmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1jYXJkLS1wbGF5aW5nXT1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iXCJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC10aHVtYi0tcmVhZHldPVwibGlicmFyeVZpZGVvRHVyYXRpb25zLmhhcyhpKVwiXG4gICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExpYnJhcnlDbGlwKGkpXCI+XG4gICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAjY2xpcFZpZGVvXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsaXAtdGh1bWJfX3ZpZGVvXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwidXJsXCJcbiAgICAgICAgICAgICAgICAgIHByZWxvYWQ9XCJtZXRhZGF0YVwiXG4gICAgICAgICAgICAgICAgICBwbGF5c2lubGluZVxuICAgICAgICAgICAgICAgICAgbXV0ZWRcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxpYnJhcnlDbGlwTWV0YWRhdGFMb2FkZWQoaSwgY2xpcFZpZGVvKVwiXG4gICAgICAgICAgICAgICAgICAoZHVyYXRpb25jaGFuZ2UpPVwib25MaWJyYXJ5Q2xpcE1ldGFkYXRhTG9hZGVkKGksIGNsaXBWaWRlbylcIj48L3ZpZGVvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLXRodW1iX19vdmVybGF5XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xpcC10aHVtYl9fcGxheS1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiEoaSA9PT0gY3VycmVudFZpZGVvSW5kZXggJiYgaXNQbGF5aW5nKVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMuNSAxLjc1TDExLjM3NSA3TDMuNSAxMi4yNVYxLjc1WlwiIGZpbGw9XCIjRkZGRkZGXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDE0IDE0XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cmVjdCB4PVwiMy41XCIgeT1cIjIuNVwiIHdpZHRoPVwiMi41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMC41XCIgZmlsbD1cIiNGRkZGRkZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjhcIiB5PVwiMi41XCIgd2lkdGg9XCIyLjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIwLjVcIiBmaWxsPVwiI0ZGRkZGRlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImkgPT09IGN1cnJlbnRWaWRlb0luZGV4ICYmIGlzUGxheWluZ1wiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLXBsYXlpbmdcIj5QTEFZSU5HPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibmV3VmlkZW9JbmRleGVzLmhhcyhpKSAmJiBpICE9PSBjdXJyZW50VmlkZW9JbmRleFwiIGNsYXNzPVwiY2xpcC10aHVtYl9fYmFkZ2UgY2xpcC10aHVtYl9fYmFkZ2UtLW5ld1wiPk5FVzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsaXAtdGh1bWJfX2R1cmF0aW9uXCI+e3sgZm9ybWF0VGltZShsaWJyYXJ5VmlkZW9EdXJhdGlvbnMuZ2V0KGkpIHx8IDApIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaXAtbWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlwLW1ldGFfX3RpdGxlXCI+Q2xpcCB7eyBpICsgMSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0blwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuY2xpcC1kb3dubG9hZC1idG4tLWRvd25sb2FkaW5nXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkQ2xpcChpKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRvd25sb2FkaW5nSW5kZXhlcy5oYXMoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAxMiAxMlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWdtYSBpY29uOiB1cHdhcmQgYXJyb3cgd2l0aCBhIHNob3J0IHRyYXkgbGluZSBhdCB0aGUgYm90dG9tIChzaGFyZS9leHBvcnQgZ2x5cGgpLiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYgOC41VjJNNiAyTDMgNU02IDJMOSA1TTMgMTAuNUg5XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS4xXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+RG93bmxvYWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkb3dubG9hZGluZ0luZGV4ZXMuaGFzKGkpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJjbGlwLWRvd25sb2FkLWJ0bl9fcmluZ1wiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI3XCIgY3k9XCI3XCIgcj1cIjZcIiBzdHJva2U9XCIjRTVFN0VCXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjdcIiBjeT1cIjdcIiByPVwiNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJkb3dubG9hZFJpbmdDaXJjdW1mZXJlbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNob2Zmc2V0XT1cImRvd25sb2FkUmluZ0Rhc2hvZmZzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA3IDcpXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZG93bmxvYWRQcm9ncmVzcy5nZXQoaSkgfHwgMCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weC0yIGNxYS1weS0yIGNxYS1iZy13aGl0ZVwiIHN0eWxlPVwiYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFNUU3RUI7XCIgW25nQ2xhc3NdPVwieydjcWEtbXQtYXV0byc6IGhhc0RldmljZUZyYW1lICYmICEoc2hvd1ZpZGVvTGlicmFyeSAmJiB2aWRlb1VybHMgJiYgdmlkZW9VcmxzLmxlbmd0aCA+IDApfVwiICpuZ0lmPVwiY3VycmVudFZpZGVvVXJsICYmICghaXNMaXZlIHx8IGxpdmVTZXNzaW9uVmlldyA9PT0gJ2NhcHR1cmVkJylcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNWaWRlb0Z1bGxNb2RlXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbWItMiBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLWJsb2NrXCI+XG4gICAgICAgICAgVmlkZW8ge3sgY3VycmVudFZpZGVvSW5kZXggKyAxIH19IHBsYXlpbmcgb3V0IG9mIHt7IHZpZGVvVXJscz8ubGVuZ3RoIHx8IDAgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImhhc011bHRpcGxlVmlkZW9zICYmICFpc1ZpZGVvRnVsbE1vZGVcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyICFjcWEtcHgtMCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBob3ZlcjpjcWEtb3BhY2l0eS03MCBjcWEtdHJhbnNpdGlvbi1vcGFjaXR5IGNxYS1vdXRsaW5lLW5vbmVcIlxuICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImN1cnJlbnRWaWRlb0luZGV4ID09PSAwXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnY3FhLW9wYWNpdHktNTAgY3FhLWN1cnNvci1ub3QtYWxsb3dlZCc6IGN1cnJlbnRWaWRlb0luZGV4ID09PSAwfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicHJldlZpZGVvKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlByZXZpb3VzIHZpZGVvXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdy00IGNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzM3NDE1MV1cIiBbbmdDbGFzc109XCJ7J2NxYS1vcGFjaXR5LTUwIGNxYS1jdXJzb3Itbm90LWFsbG93ZWQnOiBjdXJyZW50VmlkZW9JbmRleCA9PT0gMH1cIj5za2lwX3ByZXZpb3VzPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlclwiIHN0eWxlPVwid2lkdGg6IDE2cHg7IGhlaWdodDogMTZweDtcIj5cbiAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgICAqbmdJZj1cImlzUGxheWVyU3dpdGNoaW5nXCJcbiAgICAgICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgICAgICBkaWFtZXRlcj1cIjE2XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrXCI+XG4gICAgICAgICAgICA8L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQbGF5ZXJTd2l0Y2hpbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciAhY3FhLXB4LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgaG92ZXI6Y3FhLW9wYWNpdHktNzAgY3FhLXRyYW5zaXRpb24tb3BhY2l0eSBjcWEtb3V0bGluZS1ub25lXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogYXV0bztcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGxheSgpXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7IGlzUGxheWluZyA/ICdQYXVzZScgOiAnUGxheScgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1BsYXlpbmdcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMkwxMyA4TDMgMTRWMlpcIiBmaWxsPVwiIzM3NDE1MVwiLz5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzUGxheWluZ1wiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgIDxyZWN0IHg9XCIzXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgICAgPHJlY3QgeD1cIjEwXCIgeT1cIjJcIiB3aWR0aD1cIjNcIiBoZWlnaHQ9XCIxMlwiIGZpbGw9XCIjMzc0MTUxXCIvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiaGFzTXVsdGlwbGVWaWRlb3MgJiYgIWlzVmlkZW9GdWxsTW9kZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItbm9uZSBjcWEtY3Vyc29yLXBvaW50ZXIgIWNxYS1weC0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvO1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSlcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJuZXh0VmlkZW8oKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTmV4dCB2aWRlb1wiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXctNCBjcWEtaC00ICFjcWEtdGV4dC1bMTZweF0gY3FhLXRleHQtWyMzNzQxNTFdXCIgW25nQ2xhc3NdPVwieydjcWEtb3BhY2l0eS01MCBjcWEtY3Vyc29yLW5vdC1hbGxvd2VkJzogdmlkZW9VcmxzICYmIChjdXJyZW50VmlkZW9JbmRleCA+PSB2aWRlb1VybHMubGVuZ3RoIC0gMSl9XCI+c2tpcF9uZXh0PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIHt7IGZvcm1hdFRpbWUoaXNWaWRlb0Z1bGxNb2RlID8gKGdsb2JhbEN1cnJlbnRUaW1lTXMgLyAxMDAwKSA6ICh2cGxheWVyPy5uYXRpdmVFbGVtZW50Py5jdXJyZW50VGltZSB8fCAwKSkgfX1cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICA8ZGl2ICNzcGVlZENvbnRyb2xDb250YWluZXIgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLW1yLVs4cHhdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1iZy10cmFuc3BhcmVudCBjcWEtYm9yZGVyLW5vbmUgY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bMTBweF0gY3FhLWxlYWRpbmctWzE1cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXNlbGVjdC1ub25lIGhvdmVyOmNxYS1vcGFjaXR5LTcwIGNxYS10cmFuc2l0aW9uLW9wYWNpdHkgY3FhLW91dGxpbmUtbm9uZSBjcWEtcHgtMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTcGVlZENvbnRyb2woKVwiXG4gICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidQbGF5YmFjayBTcGVlZCdcIlxuICAgICAgICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidiZWxvdydcIj5cbiAgICAgICAgICAgICAge3sgY3VycmVudFNwZWVkIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc1NwZWVkQ29udHJvbE9wZW5cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtYm90dG9tLWZ1bGwgY3FhLW1iLTIgY3FhLXJpZ2h0LTAgY3FhLWJnLVsjRjBGMEYxXSBjcWEtcm91bmRlZC1sZyBjcWEtb3ZlcmZsb3ctaGlkZGVuIGNxYS1zaGFkb3ctbGcgY3FhLXotNTBcIlxuICAgICAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDogbWF4LWNvbnRlbnQ7IGxlZnQ6IDUwJTsgYm90dG9tOiAwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDEwMTtcIj5cbiAgICAgICAgICAgICAgPGNxYS1zZWdtZW50LWNvbnRyb2xcbiAgICAgICAgICAgICAgICBbc2VnbWVudHNdPVwic3BlZWRTZWdtZW50c1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImN1cnJlbnRTcGVlZFwiXG4gICAgICAgICAgICAgICAgW2NvbnRhaW5lckJnQ29sb3JdPVwiJyNGMEYwRjEnXCJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25TcGVlZENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8ZGl2IFxuICAgICAgICAgICAgICAjdGltZWxpbmVCYXJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLWgtMSBjcWEtYmctZ3JheS0yMDAgY3FhLXJvdW5kZWQtZnVsbCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXctZnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblRpbWVsaW5lQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtYXJrZXIgb2YgKGlzVmlkZW9GdWxsTW9kZSA/IGZ1bGxWaWRlb01hcmtlcnMgOiBjdXJyZW50VmlkZW9NYXJrZXJzKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUubGVmdC4lXT1cImlzVmlkZW9GdWxsTW9kZSA/IGdldEdsb2JhbEZ1bGxTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcikgOiBnZXRTdGVwTGVmdFBvc2l0aW9uKG1hcmtlcilcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzhweCdcIlxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cIic4cHgnXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0R2xvYmFsTWFya2VyQ29sb3IobWFya2VyLmxldmVsKVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiJzJweCBzb2xpZCAnICsgZ2V0R2xvYmFsTWFya2VyUmVzdWx0Q29sb3IobWFya2VyLnJlc3VsdClcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm94LXNpemluZ109XCInYm9yZGVyLWJveCdcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJtYXJrZXIudGl0bGUgfHwgJydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBhdXRvOyB6LWluZGV4OiA1MDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsgdG9wOiA1MCU7XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTWFya2VyQ2xpY2soJGV2ZW50LCBtYXJrZXIpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC0wIGNxYS10b3AtMCBjcWEtaC1mdWxsIGNxYS1iZy1ibHVlLTUwMCBjcWEtcm91bmRlZC1mdWxsXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiaXNWaWRlb0Z1bGxNb2RlID8gZ2xvYmFsU2NydWJiZXJQZXJjZW50IDogcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJkcmFnZ2luZyA/ICdub25lJyA6ICd3aWR0aCAxMDBtcydcIlxuICAgICAgICAgICAgICBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lOyB6LWluZGV4OiAyO1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC0xLzIgY3FhLXctMyBjcWEtaC0zIGNxYS1iZy1ibHVlLTYwMCBjcWEtcm91bmRlZC1mdWxsIGNxYS1jdXJzb3ItZ3JhYiBhY3RpdmU6Y3FhLWN1cnNvci1ncmFiYmluZyBjcWEtc2hhZG93LW1kXCJcbiAgICAgICAgICAgICAgW3N0eWxlLmxlZnQuJV09XCJpc1ZpZGVvRnVsbE1vZGUgPyBnbG9iYWxTY3J1YmJlclBlcmNlbnQgOiBwcm9ncmVzc1wiXG4gICAgICAgICAgICAgIHN0eWxlPVwidHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7IHotaW5kZXg6IDYwO1wiXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnREcmFnKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjOUNBM0FGXSBjcWEtdGV4dC1bOXB4XSBjcWEtZm9udC1ub3JtYWwgY3FhLXdoaXRlc3BhY2Utbm93cmFwIGNxYS1zZWxlY3Qtbm9uZSBjcWEtbXItMlwiPlxuICAgICAgICAgICAge3sgZm9ybWF0VGltZShpc1ZpZGVvRnVsbE1vZGUgPyAodG90YWxEdXJhdGlvbiAvIDEwMDApIDogKHZwbGF5ZXI/Lm5hdGl2ZUVsZW1lbnQ/LmR1cmF0aW9uIHx8IDApKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIhaXNGYXN0Rm9yd2FyZGluZyAmJiAhaXNMaXZlICYmIGN1cnJlbnRWaWV3ID09PSAnc2NyZWVuc2hvdHMnXCIgY2xhc3M9XCJjcWEtaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNjcmVlblNob3RVcmxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RldmljZUZyYW1lOyBlbHNlIHNjcmVlbnNob3ROb0ZyYW1lXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXJlbGF0aXZlIGNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtbWF4LWgtZnVsbFwiIFtuZ0NsYXNzXT1cInsnY3FhLXJvdW5kZWQtbWQgY3FhLW92ZXJmbG93LWhpZGRlbic6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInLCAnY3FhLW1pbi13LW1heCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2RldmljZSd9XCI+XG4gICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICBbc3JjXT1cImRldmljZU1vY2t1cEltYWdlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJEZXZpY2UgbW9ja3VwXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLXctYXV0byBjcWEtb2JqZWN0LWNvbnRhaW4gY3FhLWJsb2NrIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LTEwXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2NxYS1tYXgtaC1baW5oZXJpdF0nOiBlZmZlY3RpdmVQbGF0Zm9ybVR5cGUgPT09ICdicm93c2VyJywgJ2NxYS1tYXgtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBbbmdTdHlsZV09XCJkZXZpY2VTY3JlZW5TdHlsZVwiIFtuZ0NsYXNzXT1cInsnY3FhLWJnLXdoaXRlJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlICE9PSAnYnJvd3Nlcid9XCI+XG4gICAgICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIlNjcmVlbnNob3RcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydjcWEtei0yMCc6IGVmZmVjdGl2ZVBsYXRmb3JtVHlwZSA9PT0gJ2Jyb3dzZXInfVwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1oLWZ1bGwgY3FhLWJsb2NrIGNxYS1iZy1bIyNGMkYyRjJdXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzY3JlZW5zaG90Tm9GcmFtZT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wLTRcIj5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJzY3JlZW5TaG90VXJsXCJcbiAgICAgICAgICAgICAgYWx0PVwiU2NyZWVuc2hvdFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3FhLW9iamVjdC1jb250YWluIGNxYS13LWZ1bGwgY3FhLWgtZnVsbCBjcWEtYmxvY2sgY3FhLWJnLVsjI0YyRjJGMl1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgIFxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1wLTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbSBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCIhc2NyZWVuU2hvdFVybFwiPlxuICAgICAgICBObyBzY3JlZW5zaG90IGF2YWlsYWJsZVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiIWlzRmFzdEZvcndhcmRpbmcgJiYgIWlzTGl2ZSAmJiBjdXJyZW50VmlldyA9PT0gJ3RyYWNlJ1wiIGNsYXNzPVwiY3FhLWgtZnVsbCBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXJlbGF0aXZlXCIgKm5nSWY9XCJ0cmFjZVZpZXdVcmxcIiBbbmdDbGFzc109XCJ7JyFjcWEtaC1mdWxsJzogZWZmZWN0aXZlUGxhdGZvcm1UeXBlID09PSAnZGV2aWNlJ31cIiBzdHlsZT1cInBhZGRpbmctdG9wOiA0OHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXctZnVsbCBjcWEtaC1mdWxsIGNxYS1vdmVyZmxvdy1oaWRkZW4gY3FhLXJlbGF0aXZlXCI+XG4gICAgICAgICAgPGlmcmFtZSBcbiAgICAgICAgICAgIFtzcmNdPVwic2FmZVRyYWNlVXJsXCIgXG4gICAgICAgICAgICB0aXRsZT1cIlRyYWNlIFZpZXdlclwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1vYmplY3QtY29udGFpbiBjcWEtdy1mdWxsIGNxYS1taW4taC1bMjUwcHhdIGNxYS1tYXgtaC1mdWxsIGNxYS1ibG9jayBjcWEtYmctWyMjRjJGMkYyXVwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IC00OHB4OyBoZWlnaHQ6IGNhbGMoMTAwJSArIDQ4cHgpO1wiXG4gICAgICAgICAgICBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuXG4gICAgICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICAgICAgbG9hZGluZz1cImxhenlcIlxuICAgICAgICAgICAgKGxvYWQpPVwib25UcmFjZVZpZXdlckxvYWQoKVwiXG4gICAgICAgICAgICAoZXJyb3IpPVwib25UcmFjZVZpZXdlckVycm9yKClcIj5cbiAgICAgICAgICA8L2lmcmFtZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8ZGl2ICpuZ0lmPVwidHJhY2VWaWV3ZXJMb2FkaW5nXCIgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWluc2V0LTAgY3FhLWJnLVsjRjNGNEY2XSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtei0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtc21cIj5cbiAgICAgICAgICAgIExvYWRpbmcgdHJhY2Ugdmlld2VyLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPGRpdiAqbmdJZj1cInRyYWNlVmlld2VyRXJyb3JcIiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtaW5zZXQtMCBjcWEtYmctWyNGM0Y0RjZdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS16LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1zbVwiPlxuICAgICAgICAgICAgRmFpbGVkIHRvIGxvYWQgdHJhY2Ugdmlld2VyXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXAtMTAgY3FhLXRleHQtY2VudGVyIGNxYS10ZXh0LWdyYXktNDAwIGNxYS10ZXh0LXNtIGNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXJcIiAqbmdJZj1cIiF0cmFjZVZpZXdVcmxcIj5cbiAgICAgICAgTm8gdHJhY2UgYXZhaWxhYmxlXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj4gIFxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|