From 14085c438ada4cdf091aab1a550d6297db41f46c Mon Sep 17 00:00:00 2001 From: JiHong88 <0125ses@hanmail.net> Date: Mon, 14 Jan 2019 10:15:38 +0900 Subject: [PATCH] build: 2.9.5 --- dist/css/suneditor.min.css | 2 +- dist/suneditor.min.js | 2 +- sample/build/suneditor.customize.js | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/css/suneditor.min.css b/dist/css/suneditor.min.css index c17fbd662..c07bcf6b6 100644 --- a/dist/css/suneditor.min.css +++ b/dist/css/suneditor.min.css @@ -1 +1 @@ -.sun-editor{-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;-webkit-user-select:none;background-color:#fff;border:1px solid #dadada;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;height:auto;text-align:left;user-select:none;width:auto;z-index:2147483647}.sun-editor *{-webkit-user-drag:none;box-sizing:border-box}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{border:0;color:#000!important;margin:0;padding:0}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{border:0!important;resize:none!important}.sun-editor button{background-color:transparent;border:0;cursor:pointer;outline:none;touch-action:manipulation}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button .txt{display:block;margin-top:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@font-face{font-family:Suneditor-icon;font-style:normal;font-weight:400;src:url(../fonts/515c4193711dcb9fd4965352795ddd98.eot);src:url(../fonts/515c4193711dcb9fd4965352795ddd98.eot?#iefix) format("embedded-opentype"),url(../fonts/00430956d75676752a563eca7b601f36.woff2) format("woff2"),url(../fonts/e47deff1b64f042b23eaf72313bbc7dd.woff) format("woff"),url(../fonts/06f204ed446270e8db471b291e928a36.ttf) format("truetype"),url(../fonts/24ffaf89925b7b75213d80862f25f4fd.svg#Glyphter) format("svg")}.sun-editor [class*=icon-]:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#000;display:inline-block;font-family:Suneditor-icon;font-size:15px;font-style:normal;font-variant:normal;font-weight:400;text-rendering:auto}.sun-editor .sun-editor-id-toolbar [class*=icon-]:before{line-height:2.1}.sun-editor .icon-align-just:before{content:"A"}.sun-editor .icon-align-left:before{content:"B"}.sun-editor .icon-align-right:before{content:"C"}.sun-editor .icon-align-center:before{content:"D"}.sun-editor .icon-underline:before{content:"E"}.sun-editor .icon-bold:before{content:"F"}.sun-editor .icon-italic:before{content:"G"}.sun-editor .icon-strokethrough:before{content:"H"}.sun-editor .icon-subscript:before{content:"I"}.sun-editor .icon-superscript:before{content:"J"}.sun-editor .icon-redo:before{content:"K"}.sun-editor .icon-undo:before{content:"L"}.sun-editor .icon-erase:before{content:"M"}.sun-editor .icon-fontColor:before{content:"N"}.sun-editor .icon-hiliteColor:before{content:"O"}.sun-editor .icon-indent-left:before{content:"P"}.sun-editor .icon-indent-right:before{content:"Q"}.sun-editor .icon-list-bullets:before{content:"R"}.sun-editor .icon-list-number:before{content:"S"}.sun-editor .icon-grid:before{content:"T"}.sun-editor .icon-code-view:before{content:"U"}.sun-editor .icon-preview:before{content:"V"}.sun-editor .icon-showBlocks:before{content:"W"}.sun-editor .icon-expansion:before{content:"X"}.sun-editor .icon-reduction:before{content:"Y"}.sun-editor .icon-image:before{content:"Z"}.sun-editor .icon-link:before{content:"a"}.sun-editor .icon-video:before{content:"b"}.sun-editor .icon-print:before{content:"c"}.sun-editor .icon-modify:before{content:"d"}.sun-editor .icon-revert:before{content:"e"}.sun-editor .icon-arrow-down:before{content:"f";font-size:10px}.sun-editor .icon-map-pin:before{content:"g"}.sun-editor .icon-cancel:before{content:"h";font-size:10px}.sun-editor .icon-hr:before{content:"i"}.sun-editor .icon-insert-column-right:before{content:"j"}.sun-editor .icon-insert-row-below:before{content:"k"}.sun-editor .icon-insert-row-above:before{content:"l"}.sun-editor .icon-insert-column-left:before{content:"m"}.sun-editor .icon-delete-row:before{content:"n"}.sun-editor .icon-delete-column:before{content:"o"}.sun-editor .icon-quote:before{content:"p"}.sun-editor .icon-empty-file:before{content:"q"}.sun-editor .icon-paragraph:before{content:"r"}.sun-editor .icon-delete:before{content:"s"}.sun-editor .icon-rotate-left:before{content:"t"}.sun-editor .icon-rotate-right:before{content:"u"}.sun-editor .icon-mirror-horizontal:before{content:"v"}.sun-editor .icon-mirror-vertical:before{content:"w"}.sun-editor .sun-editor-container{height:100%;position:relative;width:100%}.sun-editor .arrow,.sun-editor .arrow:after{border:11px solid transparent;display:block;height:0;position:absolute;width:0}.sun-editor .arrow.arrow-up{border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0;left:20px;margin-left:-11px;top:-11px}.sun-editor .arrow.arrow-up:after{border-bottom-color:#fff;border-top-width:0;content:" ";margin-left:-11px;top:1px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-up:after{border-bottom-color:#fafafa}.sun-editor .arrow.arrow-down{border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);left:0;margin-left:-11px;top:0}.sun-editor .arrow.arrow-down:after{border-bottom-width:0;border-top-color:#fff;content:" ";margin-left:-11px;top:-12px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-down:after{border-top-color:#fafafa}.sun-editor .sun-editor-id-toolbar{background-color:#fafafa;display:block;height:auto;margin:0;outline:1px solid #dadada;overflow:visible;padding:4px 3px 0;position:relative;z-index:2}.sun-editor .sun-editor-id-toolbar-cover{background-color:#fefefe;cursor:not-allowed;display:none;filter:alpha(opacity=50);font-size:36px;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%;z-index:4}.sun-editor .sun-editor-toolbar-separator-vertical{display:inline-block;height:31px;margin:2px;vertical-align:top;width:1px}.sun-editor .sun-editor-id-toolbar.sun-inline-toolbar{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;position:absolute}.sun-editor .sun-editor-id-toolbar.sun-editor-sticky{position:fixed;top:0}.sun-editor .sun-editor-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .tool_module{display:inline-block}.sun-editor .sun-editor-module-border{border:1px solid #dadada;border-radius:5px}.sun-editor .tool_module_enter{background-color:transparent;display:block;height:1px;margin-bottom:5px;width:100%}.sun-editor .editor_tool,.sun-editor .editor_tool li{float:left;margin:0;padding:0}.sun-editor .editor_tool li{position:relative}.sun-editor .btn_editor{border:0;border-radius:4px;float:left;font-size:12px;height:35px;line-height:27px;margin:1px!important;overflow:hidden;width:35px}.sun-editor .btn_editor:enabled:focus,.sun-editor .btn_editor:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_editor:enabled.on{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled.on:focus,.sun-editor .btn_editor:enabled.on:hover{background-color:#bbd5e0;border-color:#8baab7;outline:0 none}.sun-editor .btn_editor:enabled.on:active{-webkit-box-shadow:inset 0 3px 5px #8baab7;background-color:#bbd5e0;border-color:#8baab7;box-shadow:inset 0 3px 5px #8baab7}.sun-editor .btn_edit:enabled:focus,.sun-editor .btn_edit:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_edit:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_edit:disabled,.sun-editor .btn_editor:disabled,.sun-editor .btn_editor:disabled *,.sun-editor :disabled [class*=icon-]:before{background:#fafafa;color:transparent;cursor:default;text-shadow:0 0 3px #ccc}.sun-editor .layer_editor{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-color:#fff;border:1px solid #bababa;border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;left:1px;outline:0 none;overflow-x:hidden;overflow-y:auto;position:absolute;top:37px;z-index:3}.sun-editor .layer_editor.layer_size{max-height:300px}.sun-editor .layer_editor .write_place .inp_txt{border:0;float:left;font-size:12px;height:23px;margin-top:0;outline:0 none;text-indent:6px;width:100%}.sun-editor .layer_editor button{margin:0!important;overflow:hidden;width:100%}.sun-editor .editor_tool .layer_editor button:focus,.sun-editor .layer_editor button:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .layer_editor .list_family{left:0;width:156px}.sun-editor .layer_editor .list_family .default{border-bottom:1px solid #ccc}.sun-editor .layer_editor .format_list{left:0;width:175px}.sun-editor .layer_editor .format_list li{padding:0;width:100%}.sun-editor .layer_editor .format_list .btn_edit{height:auto;line-height:100%;margin:0 0 4px!important;padding:2px 10px 5px}.sun-editor .layer_editor .format_list .txt_size18{padding:1px 10px 6px}.sun-editor .layer_editor .format_list .txt_size24{line-height:24px;padding:3px 10px 11px}.sun-editor .layer_editor .format_list .txt_size36{line-height:36px;padding:4px 10px 15px}.sun-editor .layer_editor .font_size_list{left:0;width:140px}.sun-editor .layer_editor .font_size_list .btn_edit{height:auto;line-height:normal!important;margin:0 0 7px!important;padding:2px 10px 5px}.sun-editor .layer_editor .layer_list{left:0;width:42px}.sun-editor .layer_editor .layer_line{left:0;width:158px}.sun-editor .layer_editor .write_place{border:1px solid #dadada;float:left;height:25px;overflow:hidden;position:relative}.sun-editor .layer_align{left:9px;width:125px}.sun-editor .btn_align .img_editor{display:inline-block;height:32px;margin:-1px 10px 0 0;vertical-align:middle;width:14px}.sun-editor .list_editor{overflow:hidden;padding:6px 0;width:100%}.sun-editor .list_editor li:first-child{padding-top:0}.sun-editor .list_editor li{padding-top:5px;width:100%}.sun-editor .font_size_list li{padding:0;width:100%}.sun-editor .layer_editor.layer_line{left:0;width:158px}.sun-editor .btn_edit{font-size:12px;height:28px;line-height:22px;margin-left:0;padding:0 14px;text-align:left;text-decoration:none;text-indent:0;width:100%}.sun-editor .btn_font{padding:0;text-align:left;text-indent:7px;width:100px}.sun-editor .btn_format{padding:0;text-align:left;text-indent:7px;width:90px}.sun-editor .btn_size{padding:0;text-align:left;text-indent:7px;width:70px}.sun-editor .btn_font .txt{float:left;width:65px}.sun-editor .btn_format .txt{float:left;width:55px}.sun-editor .btn_size .txt{float:left;width:35px}.sun-editor .table-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175);float:left;font-size:14px;left:1px;list-style:none;margin:2px 0 0;padding:5px 0;position:absolute;text-align:left;top:34px;z-index:3}.sun-editor .table-data-form{font-size:18px;padding:0 5px}.sun-editor .table-picker{cursor:pointer;font-size:18px;height:10em;position:absolute!important;width:10em;z-index:3}.sun-editor .table-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEE2QjczMzdCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEE2QjczMzZCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDM2MjRFMUVCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDM2MjRFMUZCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5dMgLsAAAARUlEQVR42mL8//8/AzUAC4joWb2DbNNKQj0Y4QaBgIaKMsmG3LhzF85mYqASGDVo1KBRgwjnfvQMSA5gpFZ5RDWvAQQYAKYZD7SDi983AAAAAElFTkSuQmCC") repeat;font-size:18px;height:1em;position:absolute!important;width:1em;z-index:2}.sun-editor .table-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;font-size:18px;height:5em;position:relative!important;width:5em;z-index:1}.sun-editor .table-display{padding-left:5px}.sun-editor .sun-editor-id-table-edit{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;width:165px;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .layer_editor .pallet_color_selector{display:flex;height:auto;width:285px}.sun-editor .layer_editor .list_color{height:100%;padding:7px;width:100%}.sun-editor .layer_editor .list_color li{display:flex;float:left;margin:0;position:relative}.sun-editor .layer_editor .list_color button{display:block;height:30px;overflow:hidden;text-indent:-9999px;width:30px}.sun-editor .layer_editor .list_color button:focus,.sun-editor .layer_editor .list_color button:hover{border:1px solid #000}.sun-editor .sub-form-group{height:34px;padding:0 7px 7px}.sun-editor .sub-form-group label{display:inline-block;font-size:14px;font-weight:700;letter-spacing:1px}.sun-editor .sub-form-group input{border-bottom:5px solid #8baab7;display:inline-block;font-size:14px;text-transform:uppercase;width:130px}.sun-editor .sub-form-group input:focus{outline:none}.sun-editor .sub-form-group button{background-color:#bbd5e0;border-color:#a2bfcc;float:right;height:100%;outline:0 none;padding:0 15px;width:auto}.sun-editor .sun-editor-id-editorArea{height:auto;overflow:hidden;position:static;width:100%;z-index:1}.sun-editor .sun-editor-id-editorArea .input_editor{-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;-o-user-select:text;-webkit-overflow-scrolling:touch;-webkit-user-select:text;height:100%;overflow:auto;user-select:text;width:100%}.sun-editor .sun-editor-id-editorArea .input_editor:focus{outline:none}.sun-editor .sun-editor-id-editorArea .sun-editor-id-code{background-color:#191919;color:#fff;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:0;word-break:break-all}.sun-editor .sun-editor-id-resizingBar{background-color:#fafafa;border-top:1px solid #dadada;cursor:ns-resize;height:16px;padding:2px 8px;width:auto}.sun-editor .sun-editor-id-resizingBar.none-resize{cursor:default}.sun-editor .sun-editor-id-navigation{font-size:11px;font-weight:700;height:auto;line-height:1;margin:0;padding:0;position:absolute;width:auto}.sun-editor .sun-editor-id-dialogBox,.sun-editor .sun-editor-id-resize-background{display:none;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-dialogBox button,.sun-editor .sun-editor-id-dialogBox input,.sun-editor .sun-editor-id-dialogBox label{color:#111;font-size:14px;line-height:1.5;margin:0}.sun-editor .sun-editor-id-dialogBox .modal-dialog-background{background-color:#222;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.sun-editor .modal-dialog{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-dialog .modal-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);margin:8px auto;outline:0;position:relative;width:500px}@media screen and (max-width:509px){.sun-editor .modal-dialog .modal-content{width:100%}}.sun-editor .modal-dialog .modal-header{border-bottom:1px solid #e5e5e5;height:50px;padding:15px 15px 5px}.sun-editor .modal-dialog button.close{-webkit-appearance:none;background:transparent;border:0;color:#000;filter:alpha(opacity=100);float:right;font-size:21px;font-weight:700;line-height:1;margin:0!important;opacity:1;padding:0!important;text-shadow:0 1px 0 #fff}.sun-editor .modal-dialog button.close:focus,.sun-editor .modal-dialog button.close:hover{color:#a2bfcc!important}.sun-editor .modal-dialog .modal-body{padding:15px;position:relative}.sun-editor .modal-dialog .form-group{margin-bottom:15px}.sun-editor .modal-dialog .form-group-footer{margin-top:15px}.sun-editor .modal-dialog input:disabled{background-color:#f3f3f3}.sun-editor .modal-dialog .size-text{width:100%}.sun-editor .modal-dialog .size-text .size-h,.sun-editor .modal-dialog .size-text .size-w{text-align:center;width:72px}.sun-editor .modal-dialog .size-x{margin:0 8px;text-align:center;width:25px}.sun-editor .modal-dialog .form-size-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:inline-block;font-size:14px;height:34px;line-height:1.42857143;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:70px}.sun-editor .modal-dialog .modal-content label{display:inline-block;font-weight:700;margin-bottom:5px;max-width:100%}.sun-editor .modal-dialog .form-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:block;font-size:14px;height:34px;line-height:1.42857143;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.sun-editor .modal-dialog .modal-footer{border-top:1px solid #e5e5e5;padding:10px 15px 0;text-align:right}.sun-editor .modal-dialog .modal-content .btn{-ms-touch-action:manipulation;background-image:none;border:1px solid transparent;border-radius:4px;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin:0 0 10px!important;padding:6px 12px;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .modal-dialog .modal-content input:focus{-webkit-box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;outline:0}.sun-editor .modal-dialog .modal-radio{margin-left:12px;margin-right:5px}.sun-editor .modal-dialog .btn-primary{background-color:#d4e3ea;border-color:#a2bfcc;color:#fff}.sun-editor .modal-dialog .btn-primary:focus,.sun-editor .modal-dialog .btn-primary:hover{background-color:#bbd5e0!important;border-color:#a2bfcc!important;outline:0 none!important}.sun-editor .modal-dialog .btn-primary:active{-webkit-box-shadow:inset 0 3px 5px #a2bfcc;background-color:#bbd5e0;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #a2bfcc}.sun-editor .sun-editor-id-loading{background-color:#fff;display:none;filter:alpha(opacity=70);height:100%;left:0;opacity:.7;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-loading .loading-effect{animation:spinner .8s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:2px solid #07d;display:block;height:25px;left:50%;margin:-25px 0 0 -25px;position:absolute;top:50%;width:25px}@keyframes spinner{to{transform:rotate(1turn)}}.sun-editor .resize-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;margin-top:-50px!important;padding:0 0 2px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .btn-group{display:flex;padding:2px 2px 0 0;position:relative;vertical-align:middle}.sun-editor .btn-group button{-ms-touch-action:manipulation;background-color:#fff!important;border:1px solid rgba(0,0,0,.2)!important;border-bottom-right-radius:0;border-radius:4px!important;border-top-right-radius:0;display:inline-block;font-size:12px!important;font-weight:400;height:32px;line-height:1.5!important;margin:0 0 0 2px!important;padding:5px 10px!important;position:relative;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .btn-group.remove button{height:100%;height:32px;width:100%}.sun-editor .btn-group button:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn-group button:hover,.sun-editor .resize-btn button:focus{background-color:#d4e3ea!important;border-color:#bbd5e0!important;outline:0 none!important}.sun-editor .modal-resize-container{border:1px solid #a2bfcc;display:none;position:absolute}.sun-editor .modal-resize-container .modal-resize{background-color:#a2bfcc;display:inline-block;opacity:.3;position:absolute}.sun-editor .modal-resize-container .resize-dot{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-resize-container .resize-dot>div{background-color:#a2bfcc;border:1px solid #000;height:7px;position:absolute;width:7px}.sun-editor .modal-resize-container .resize-dot>.tl{cursor:nw-resize;left:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.tr{cursor:ne-resize;right:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.bl{bottom:-5px;cursor:sw-resize;left:-5px}.sun-editor .modal-resize-container .resize-dot>.br{bottom:-5px;cursor:se-resize;right:-5px}.sun-editor .modal-resize-container .resize-dot>.lw{bottom:50%;cursor:w-resize;left:-7px}.sun-editor .modal-resize-container .resize-dot>.th{cursor:n-resize;left:50%;top:-7px}.sun-editor .modal-resize-container .resize-dot>.rw{bottom:50%;cursor:e-resize;right:-7px}.sun-editor .modal-resize-container .resize-dot>.bh{bottom:-7px;cursor:s-resize;right:50%}.sun-editor .modal-resize-container .resize-display{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:red;border-radius:5px;bottom:0;color:#fff;font-size:12px;margin:5px;padding:5px;position:absolute;right:0}.sun-editor .sun-editor-id-link-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .sun-editor-id-link-btn:after,.sun-editor .sun-editor-id-link-btn:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sun-editor .sun-editor-id-link-btn .link-content{margin:0;padding:0}.sun-editor .sun-editor-id-link-btn .link-content a{display:inline-block;margin-left:5px;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.sun-editor .sun-editor-tab-button{border-bottom:1px solid #e5e5e5;height:25px;width:100%}.sun-editor .sun-editor-tab-button button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .sun-editor-tab-button button:hover{background-color:#fff}.sun-editor .sun-editor-tab-button button.active{background-color:#fff;border-bottom:0}.sun-editor .sun-editor-id-notice{background-color:#f2dede;border:1px solid #eed3d7;color:#b94a48;display:none;font-size:13px;height:auto;margin:0;padding:15px;position:relative;width:100%;word-break:break-all}.sun-editor .sun-editor-id-notice button{float:right}.sun-editor-editable{background-color:#fff;color:#000;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:10px 20px;text-align:left;word-break:break-all}.sun-editor-editable *{background-color:inherit;box-sizing:border-box;color:inherit;font-family:inherit;font-size:inherit}.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th{position:relative}.sun-editor-editable .float-left{float:left}.sun-editor-editable .float-right{float:right}.sun-editor-editable .float-center{float:center}.sun-editor-editable .float-none{float:none}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable a:focus,.sun-editor-editable a:hover{color:#0093ff;cursor:pointer;text-decoration:underline}.sun-editor-editable pre{background-color:#f6f8fa;border:1px solid #dce5e5;border-radius:3px;color:#333;display:block;font-size:13px;line-height:1.45;margin:0;overflow:auto;padding:8px;word-break:break-all;word-wrap:break-word}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;margin-bottom:5px;text-align:-webkit-match-parent}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{border-color:#8baab7;border-style:solid;border-width:0 0 0 5px;display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:40px;margin-inline-start:40px;padding:0 5px 0 20px}.sun-editor-editable blockquote blockquote{border-color:#a2bfcc}.sun-editor-editable blockquote blockquote blockquote{border-color:#bbd5e0}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#d4e3ea}.sun-editor-editable h1{font-size:2em;margin-block-end:.67em;margin-block-start:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h2{font-size:1.5em;margin-block-end:.83em;margin-block-start:.83em}.sun-editor-editable h3{font-size:1.17em;margin-block-end:1em;margin-block-start:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h4{margin-block-end:1.33em;margin-block-start:1.33em}.sun-editor-editable h5{font-size:.83em;margin-block-end:1.67em;margin-block-start:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h6{font-size:.67em;margin-block-end:2.33em;margin-block-start:2.33em}.sun-editor-editable hr{border-color:#000;border-image:initial;border-width:1px 0 0;display:block;height:1px}.sun-editor-editable hr.solid{border-style:solid none none}.sun-editor-editable hr.dotted{border-style:dotted none none}.sun-editor-editable hr.dashed{border-style:dashed none none}.sun-editor-editable img.inner-link{margin:1px;outline:1px solid #a2bfcc;padding:1px}.sun-editor-editable table{background-color:transparent;border:1px solid #ccc;border-collapse:collapse;border-spacing:0;display:table;margin-bottom:20px;max-width:100%;table-layout:auto;width:100%}.sun-editor-editable table tr{border:1px solid #ccc}.sun-editor-editable table td{border:1px solid #ccc;padding:8px}.sun-editor-editable table td.sun-editor-selected-cell{outline:2px solid #8baab7}.sun-editor-editable .sun-editor-id-comp{display:flex;padding:1px}.sun-editor-editable[contenteditable=true] .sun-editor-id-comp{outline:1px dashed #ccc}.sun-editor-editable figure.sun-editor-figure-cover{display:block;margin:0;outline:none;padding:0}.sun-editor-editable figure.sun-editor-figure-cover figcaption{background-color:#f3f3f3;font-size:13px;margin:0;outline:none;padding:1em .5em}.sun-editor-editable figure.sun-editor-figure-cover figcaption p{line-height:2;margin:0}.sun-editor-editable .sun-editor-id-image-container a img{margin:1px;outline:1px solid #8baab7;padding:1px}.sun-editor-editable .sun-editor-id-iframe-container iframe{outline:1px solid #9e9e9e}.sun-editor-editable .sun-editor-id-iframe-inner-resizing-cover{display:none}.sun-editor-editable[contenteditable=true] .sun-editor-id-iframe-inner-resizing-cover{background-color:transparent;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor-show-block div,.sun-editor-show-block h1,.sun-editor-show-block h2,.sun-editor-show-block h3,.sun-editor-show-block h4,.sun-editor-show-block h5,.sun-editor-show-block h6,.sun-editor-show-block p{border:1px dashed #a2bfcc;padding:10px 8px 8px}.sun-editor-show-block p{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block div{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h1{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h2{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h3{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h4{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h5{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h6{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC") no-repeat} \ No newline at end of file +.sun-editor{-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;-webkit-user-select:none;background-color:#fff;border:1px solid #dadada;box-sizing:border-box;font-family:Helvetica Neue,sans-serif;height:auto;text-align:left;user-select:none;width:auto;z-index:2147483647}.sun-editor *{-webkit-user-drag:none;box-sizing:border-box}.sun-editor-common button,.sun-editor-common input,.sun-editor-common select,.sun-editor-common textarea{font-size:14px;line-height:1.5}.sun-editor-common blockquote,.sun-editor-common body,.sun-editor-common button,.sun-editor-common code,.sun-editor-common dd,.sun-editor-common div,.sun-editor-common dl,.sun-editor-common dt,.sun-editor-common fieldset,.sun-editor-common form,.sun-editor-common h1,.sun-editor-common h2,.sun-editor-common h3,.sun-editor-common h4,.sun-editor-common h5,.sun-editor-common h6,.sun-editor-common input,.sun-editor-common legend,.sun-editor-common li,.sun-editor-common ol,.sun-editor-common p,.sun-editor-common pre,.sun-editor-common select,.sun-editor-common td,.sun-editor-common textarea,.sun-editor-common th,.sun-editor-common ul{border:0;color:#000!important;margin:0;padding:0}.sun-editor-common dl,.sun-editor-common li,.sun-editor-common menu,.sun-editor-common ol,.sun-editor-common ul{list-style:none!important}.sun-editor-common hr{margin:6px 0!important}.sun-editor textarea{border:0!important;resize:none!important}.sun-editor button{background-color:transparent;border:0;cursor:pointer;outline:none;touch-action:manipulation}.sun-editor button,.sun-editor input,.sun-editor select,.sun-editor textarea{vertical-align:middle}.sun-editor button .txt{display:block;margin-top:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@font-face{font-family:Suneditor-icon;font-style:normal;font-weight:400;src:url(../fonts/515c4193711dcb9fd4965352795ddd98.eot);src:url(../fonts/515c4193711dcb9fd4965352795ddd98.eot?#iefix) format("embedded-opentype"),url(../fonts/00430956d75676752a563eca7b601f36.woff2) format("woff2"),url(../fonts/e47deff1b64f042b23eaf72313bbc7dd.woff) format("woff"),url(../fonts/06f204ed446270e8db471b291e928a36.ttf) format("truetype"),url(../fonts/24ffaf89925b7b75213d80862f25f4fd.svg#Glyphter) format("svg")}.sun-editor [class*=icon-]:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#000;display:inline-block;font-family:Suneditor-icon;font-size:15px;font-style:normal;font-variant:normal;font-weight:400;text-rendering:auto}.sun-editor .sun-editor-id-toolbar [class*=icon-]:before{line-height:2.1}.sun-editor .icon-align-just:before{content:"A"}.sun-editor .icon-align-left:before{content:"B"}.sun-editor .icon-align-right:before{content:"C"}.sun-editor .icon-align-center:before{content:"D"}.sun-editor .icon-underline:before{content:"E"}.sun-editor .icon-bold:before{content:"F"}.sun-editor .icon-italic:before{content:"G"}.sun-editor .icon-strokethrough:before{content:"H"}.sun-editor .icon-subscript:before{content:"I"}.sun-editor .icon-superscript:before{content:"J"}.sun-editor .icon-redo:before{content:"K"}.sun-editor .icon-undo:before{content:"L"}.sun-editor .icon-erase:before{content:"M"}.sun-editor .icon-fontColor:before{content:"N"}.sun-editor .icon-hiliteColor:before{content:"O"}.sun-editor .icon-indent-left:before{content:"P"}.sun-editor .icon-indent-right:before{content:"Q"}.sun-editor .icon-list-bullets:before{content:"R"}.sun-editor .icon-list-number:before{content:"S"}.sun-editor .icon-grid:before{content:"T"}.sun-editor .icon-code-view:before{content:"U"}.sun-editor .icon-preview:before{content:"V"}.sun-editor .icon-showBlocks:before{content:"W"}.sun-editor .icon-expansion:before{content:"X"}.sun-editor .icon-reduction:before{content:"Y"}.sun-editor .icon-image:before{content:"Z"}.sun-editor .icon-link:before{content:"a"}.sun-editor .icon-video:before{content:"b"}.sun-editor .icon-print:before{content:"c"}.sun-editor .icon-modify:before{content:"d"}.sun-editor .icon-revert:before{content:"e"}.sun-editor .icon-arrow-down:before{content:"f";font-size:10px}.sun-editor .icon-map-pin:before{content:"g"}.sun-editor .icon-cancel:before{content:"h";font-size:10px}.sun-editor .icon-hr:before{content:"i"}.sun-editor .icon-insert-column-right:before{content:"j"}.sun-editor .icon-insert-row-below:before{content:"k"}.sun-editor .icon-insert-row-above:before{content:"l"}.sun-editor .icon-insert-column-left:before{content:"m"}.sun-editor .icon-delete-row:before{content:"n"}.sun-editor .icon-delete-column:before{content:"o"}.sun-editor .icon-quote:before{content:"p"}.sun-editor .icon-empty-file:before{content:"q"}.sun-editor .icon-paragraph:before{content:"r"}.sun-editor .icon-delete:before{content:"s"}.sun-editor .icon-rotate-left:before{content:"t"}.sun-editor .icon-rotate-right:before{content:"u"}.sun-editor .icon-mirror-horizontal:before{content:"v"}.sun-editor .icon-mirror-vertical:before{content:"w"}.sun-editor .sun-editor-container{height:100%;position:relative;width:100%}.sun-editor .arrow,.sun-editor .arrow:after{border:11px solid transparent;display:block;height:0;position:absolute;width:0}.sun-editor .arrow.arrow-up{border-bottom-color:rgba(0,0,0,.25);border-top-width:0;left:20px;margin-left:-11px;top:-11px}.sun-editor .arrow.arrow-up:after{border-bottom-color:#fff;border-top-width:0;content:" ";margin-left:-11px;top:1px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-up:after{border-bottom-color:#fafafa}.sun-editor .arrow.arrow-down{border-bottom-width:0;border-top-color:rgba(0,0,0,.25);left:0;margin-left:-11px;top:0}.sun-editor .arrow.arrow-down:after{border-bottom-width:0;border-top-color:#fff;content:" ";margin-left:-11px;top:-12px}.sun-editor .sun-editor-id-toolbar .arrow.arrow-down:after{border-top-color:#fafafa}.sun-editor .sun-editor-id-toolbar{background-color:#fafafa;display:block;height:auto;margin:0;outline:1px solid #dadada;overflow:visible;padding:4px 3px 0;position:relative;z-index:2}.sun-editor .sun-editor-id-toolbar-cover{background-color:#fefefe;cursor:not-allowed;display:none;filter:alpha(opacity=50);font-size:36px;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%;z-index:4}.sun-editor .sun-editor-toolbar-separator-vertical{display:inline-block;height:31px;margin:2px;vertical-align:top;width:1px}.sun-editor .sun-editor-id-toolbar.sun-inline-toolbar{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;position:absolute}.sun-editor .sun-editor-id-toolbar.sun-editor-sticky{position:fixed;top:0}.sun-editor .sun-editor-sticky-dummy{display:none;position:static;z-index:-1}.sun-editor .tool_module{display:inline-block}.sun-editor .sun-editor-module-border{border:1px solid #dadada;border-radius:5px}.sun-editor .tool_module_enter{background-color:transparent;display:block;height:1px;margin-bottom:5px;width:100%}.sun-editor .editor_tool,.sun-editor .editor_tool li{float:left;margin:0;padding:0}.sun-editor .editor_tool li{position:relative}.sun-editor .btn_editor{border:0;border-radius:4px;float:left;font-size:12px;height:35px;line-height:27px;margin:1px!important;overflow:hidden;width:35px}.sun-editor .btn_editor:enabled:focus,.sun-editor .btn_editor:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_editor:enabled.on{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_editor:enabled.on:focus,.sun-editor .btn_editor:enabled.on:hover{background-color:#bbd5e0;border-color:#8baab7;outline:0 none}.sun-editor .btn_editor:enabled.on:active{-webkit-box-shadow:inset 0 3px 5px #8baab7;background-color:#bbd5e0;border-color:#8baab7;box-shadow:inset 0 3px 5px #8baab7}.sun-editor .btn_edit:enabled:focus,.sun-editor .btn_edit:enabled:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .btn_edit:enabled:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#bbd5e0;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn_edit:disabled,.sun-editor .btn_editor:disabled,.sun-editor .btn_editor:disabled *,.sun-editor :disabled [class*=icon-]:before{background:#fafafa;color:transparent;cursor:default;text-shadow:0 0 3px #ccc}.sun-editor .layer_editor{-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-color:#fff;border:1px solid #bababa;border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);display:none;left:1px;outline:0 none;overflow-x:hidden;overflow-y:auto;position:absolute;top:37px;z-index:3}.sun-editor .layer_editor.layer_size{max-height:300px}.sun-editor .layer_editor .write_place .inp_txt{border:0;float:left;font-size:12px;height:23px;margin-top:0;outline:0 none;text-indent:6px;width:100%}.sun-editor .layer_editor button{margin:0!important;overflow:hidden;width:100%}.sun-editor .editor_tool .layer_editor button:focus,.sun-editor .layer_editor button:hover{background-color:#d4e3ea;border-color:#bbd5e0;outline:0 none}.sun-editor .layer_editor .list_family{left:0;width:156px}.sun-editor .layer_editor .list_family .default{border-bottom:1px solid #ccc}.sun-editor .layer_editor .format_list{left:0;width:175px}.sun-editor .layer_editor .format_list li{padding:0;width:100%}.sun-editor .layer_editor .format_list .btn_edit{height:auto;line-height:100%;margin:0 0 4px!important;padding:2px 10px 5px}.sun-editor .layer_editor .format_list .txt_size18{padding:1px 10px 6px}.sun-editor .layer_editor .format_list .txt_size24{line-height:24px;padding:3px 10px 11px}.sun-editor .layer_editor .format_list .txt_size36{line-height:36px;padding:4px 10px 15px}.sun-editor .layer_editor .font_size_list{left:0;width:140px}.sun-editor .layer_editor .font_size_list .btn_edit{height:auto;line-height:normal!important;margin:0 0 7px!important;padding:2px 10px 5px}.sun-editor .layer_editor .layer_list{left:0;width:42px}.sun-editor .layer_editor .layer_line{left:0;width:158px}.sun-editor .layer_editor .write_place{border:1px solid #dadada;float:left;height:25px;overflow:hidden;position:relative}.sun-editor .layer_align{left:9px;width:125px}.sun-editor .btn_align .img_editor{display:inline-block;height:32px;margin:-1px 10px 0 0;vertical-align:middle;width:14px}.sun-editor .list_editor{overflow:hidden;padding:6px 0;width:100%}.sun-editor .list_editor li:first-child{padding-top:0}.sun-editor .list_editor li{padding-top:5px;width:100%}.sun-editor .font_size_list li{padding:0;width:100%}.sun-editor .layer_editor.layer_line{left:0;width:158px}.sun-editor .btn_edit{font-size:12px;height:28px;line-height:22px;margin-left:0;padding:0 14px;text-align:left;text-decoration:none;text-indent:0;width:100%}.sun-editor .btn_font{padding:0;text-align:left;text-indent:7px;width:100px}.sun-editor .btn_format{padding:0;text-align:left;text-indent:7px;width:90px}.sun-editor .btn_size{padding:0;text-align:left;text-indent:7px;width:70px}.sun-editor .btn_font .txt{float:left;width:65px}.sun-editor .btn_format .txt{float:left;width:55px}.sun-editor .btn_size .txt{float:left;width:35px}.sun-editor .table-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 6px 12px rgba(0,0,0,.175);float:left;font-size:14px;left:1px;list-style:none;margin:2px 0 0;padding:5px 0;position:absolute;text-align:left;top:34px;z-index:3}.sun-editor .table-data-form{font-size:18px;padding:0 5px}.sun-editor .table-picker{cursor:pointer;font-size:18px;height:10em;position:absolute!important;width:10em;z-index:3}.sun-editor .table-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OEE2QjczMzdCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEE2QjczMzZCN0VGMTFFODg3MENEMDIzNTU4M0UyQzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NDM2MjRFMUVCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NDM2MjRFMUZCN0VFMTFFODg2RkM4MEYzQTg4MjU3RTkiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5dMgLsAAAARUlEQVR42mL8//8/AzUAC4joWb2DbNNKQj0Y4QaBgIaKMsmG3LhzF85mYqASGDVo1KBRgwjnfvQMSA5gpFZ5RDWvAQQYAKYZD7SDi983AAAAAElFTkSuQmCC") repeat;font-size:18px;height:1em;position:absolute!important;width:1em;z-index:2}.sun-editor .table-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;font-size:18px;height:5em;position:relative!important;width:5em;z-index:1}.sun-editor .table-display{padding-left:5px}.sun-editor .sun-editor-id-table-edit{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;width:165px;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .layer_editor .pallet_color_selector{display:flex;height:auto;width:285px}.sun-editor .layer_editor .list_color{height:100%;padding:7px;width:100%}.sun-editor .layer_editor .list_color li{display:flex;float:left;margin:0;position:relative}.sun-editor .layer_editor .list_color button{display:block;height:30px;overflow:hidden;text-indent:-9999px;width:30px}.sun-editor .layer_editor .list_color button:focus,.sun-editor .layer_editor .list_color button:hover{border:1px solid #000}.sun-editor .sub-form-group{height:34px;padding:0 7px 7px}.sun-editor .sub-form-group label{display:inline-block;font-size:14px;font-weight:700;letter-spacing:1px}.sun-editor .sub-form-group input{border-bottom:5px solid #8baab7;display:inline-block;font-size:14px;text-transform:uppercase;width:130px}.sun-editor .sub-form-group input:focus{outline:none}.sun-editor .sub-form-group button{background-color:#bbd5e0;border-color:#a2bfcc;float:right;height:100%;outline:0 none;padding:0 15px;width:auto}.sun-editor .sun-editor-id-editorArea{height:auto;overflow:hidden;position:static;width:100%;z-index:1}.sun-editor .sun-editor-id-editorArea .input_editor{-khtml-user-select:text;-moz-user-select:text;-ms-user-select:text;-o-user-select:text;-webkit-overflow-scrolling:touch;-webkit-user-select:text;height:100%;overflow-x:hidden;overflow-y:auto;user-select:text;width:100%}.sun-editor .sun-editor-id-editorArea .input_editor:focus{outline:none}.sun-editor .sun-editor-id-editorArea .sun-editor-id-code{background-color:#191919;color:#fff;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:0;word-break:break-all}.sun-editor .sun-editor-id-resizingBar{background-color:#fafafa;border-top:1px solid #dadada;cursor:ns-resize;height:16px;padding:2px 8px;width:auto}.sun-editor .sun-editor-id-resizingBar.none-resize{cursor:default}.sun-editor .sun-editor-id-navigation{font-size:11px;font-weight:700;height:auto;line-height:1;margin:0;padding:0;position:absolute;width:auto}.sun-editor .sun-editor-id-dialogBox,.sun-editor .sun-editor-id-resize-background{display:none;height:100%;left:0;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-dialogBox button,.sun-editor .sun-editor-id-dialogBox input,.sun-editor .sun-editor-id-dialogBox label{color:#111;font-size:14px;line-height:1.5;margin:0}.sun-editor .sun-editor-id-dialogBox .modal-dialog-background{background-color:#222;height:100%;left:0;opacity:.5;position:absolute;top:0;width:100%}.sun-editor .modal-dialog{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-dialog .modal-content{-webkit-background-clip:padding-box;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 3px 9px rgba(0,0,0,.5);margin:8px auto;outline:0;position:relative;width:500px}@media screen and (max-width:509px){.sun-editor .modal-dialog .modal-content{width:100%}}.sun-editor .modal-dialog .modal-header{border-bottom:1px solid #e5e5e5;height:50px;padding:15px 15px 5px}.sun-editor .modal-dialog button.close{-webkit-appearance:none;background:transparent;border:0;color:#000;filter:alpha(opacity=100);float:right;font-size:21px;font-weight:700;line-height:1;margin:0!important;opacity:1;padding:0!important;text-shadow:0 1px 0 #fff}.sun-editor .modal-dialog button.close:focus,.sun-editor .modal-dialog button.close:hover{color:#a2bfcc!important}.sun-editor .modal-dialog .modal-body{padding:15px;position:relative}.sun-editor .modal-dialog .form-group{margin-bottom:15px}.sun-editor .modal-dialog .form-group-footer{margin-top:15px}.sun-editor .modal-dialog input:disabled{background-color:#f3f3f3}.sun-editor .modal-dialog .size-text{width:100%}.sun-editor .modal-dialog .size-text .size-h,.sun-editor .modal-dialog .size-text .size-w{text-align:center;width:72px}.sun-editor .modal-dialog .size-x{margin:0 8px;text-align:center;width:25px}.sun-editor .modal-dialog .form-size-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:inline-block;font-size:14px;height:34px;line-height:1.42857143;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:70px}.sun-editor .modal-dialog .modal-content label{display:inline-block;font-weight:700;margin-bottom:5px;max-width:100%}.sun-editor .modal-dialog .form-control{-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);color:#555;display:block;font-size:14px;height:34px;line-height:1.42857143;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}.sun-editor .modal-dialog .modal-footer{border-top:1px solid #e5e5e5;padding:10px 15px 0;text-align:right}.sun-editor .modal-dialog .modal-content .btn{-ms-touch-action:manipulation;background-image:none;border:1px solid transparent;border-radius:4px;display:inline-block;font-size:14px;font-weight:400;line-height:1.42857143;margin:0 0 10px!important;padding:6px 12px;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .modal-dialog .modal-content input:focus{-webkit-box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 1px 1px #a2bfcc,0 0 8px #d4e3ea;outline:0}.sun-editor .modal-dialog .modal-radio{margin-left:12px;margin-right:5px}.sun-editor .modal-dialog .btn-primary{background-color:#d4e3ea;border-color:#a2bfcc;color:#fff}.sun-editor .modal-dialog .btn-primary:focus,.sun-editor .modal-dialog .btn-primary:hover{background-color:#bbd5e0!important;border-color:#a2bfcc!important;outline:0 none!important}.sun-editor .modal-dialog .btn-primary:active{-webkit-box-shadow:inset 0 3px 5px #a2bfcc;background-color:#bbd5e0;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #a2bfcc}.sun-editor .sun-editor-id-loading{background-color:#fff;display:none;filter:alpha(opacity=70);height:100%;left:0;opacity:.7;position:absolute;top:0;width:100%;z-index:2147483647}.sun-editor .sun-editor-id-loading .loading-effect{animation:spinner .8s linear infinite;border-radius:50%;border-right:2px solid transparent;border-top:2px solid #07d;display:block;height:25px;left:50%;margin:-25px 0 0 -25px;position:absolute;top:50%;width:25px}@keyframes spinner{to{transform:rotate(1turn)}}.sun-editor .resize-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid #ccc;border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;margin-top:-50px!important;padding:0 0 2px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .btn-group{display:flex;padding:2px 2px 0 0;position:relative;vertical-align:middle}.sun-editor .btn-group button{-ms-touch-action:manipulation;background-color:#fff!important;border:1px solid rgba(0,0,0,.2)!important;border-bottom-right-radius:0;border-radius:4px!important;border-top-right-radius:0;display:inline-block;font-size:12px!important;font-weight:400;height:32px;line-height:1.5!important;margin:0 0 0 2px!important;padding:5px 10px!important;position:relative;text-align:center;touch-action:manipulation;vertical-align:middle;white-space:nowrap}.sun-editor .btn-group.remove button{height:100%;height:32px;width:100%}.sun-editor .btn-group button:active{-webkit-box-shadow:inset 0 3px 5px #bbd5e0;background-color:#d4e3ea;border-color:#a2bfcc;box-shadow:inset 0 3px 5px #bbd5e0}.sun-editor .btn-group button:hover,.sun-editor .resize-btn button:focus{background-color:#d4e3ea!important;border-color:#bbd5e0!important;outline:0 none!important}.sun-editor .modal-resize-container{border:1px solid #a2bfcc;display:none;position:absolute}.sun-editor .modal-resize-container .modal-resize{background-color:#a2bfcc;display:inline-block;opacity:.3;position:absolute}.sun-editor .modal-resize-container .resize-dot{height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor .modal-resize-container .resize-dot>div{background-color:#a2bfcc;border:1px solid #000;height:7px;position:absolute;width:7px}.sun-editor .modal-resize-container .resize-dot>.tl{cursor:nw-resize;left:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.tr{cursor:ne-resize;right:-5px;top:-5px}.sun-editor .modal-resize-container .resize-dot>.bl{bottom:-5px;cursor:sw-resize;left:-5px}.sun-editor .modal-resize-container .resize-dot>.br{bottom:-5px;cursor:se-resize;right:-5px}.sun-editor .modal-resize-container .resize-dot>.lw{bottom:50%;cursor:w-resize;left:-7px}.sun-editor .modal-resize-container .resize-dot>.th{cursor:n-resize;left:50%;top:-7px}.sun-editor .modal-resize-container .resize-dot>.rw{bottom:50%;cursor:e-resize;right:-7px}.sun-editor .modal-resize-container .resize-dot>.bh{bottom:-7px;cursor:s-resize;right:50%}.sun-editor .modal-resize-container .resize-display{-moz-border-radius:5px;-webkit-border-radius:5px;background-color:red;border-radius:5px;bottom:0;color:#fff;font-size:12px;margin:5px;padding:5px;position:absolute;right:0}.sun-editor .sun-editor-id-link-btn{-webkit-background-clip:padding-box;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;box-shadow:0 5px 10px rgba(0,0,0,.2);display:none;font-size:14px;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.42857143;padding:1px;position:absolute;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal}.sun-editor .sun-editor-id-link-btn:after,.sun-editor .sun-editor-id-link-btn:before{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sun-editor .sun-editor-id-link-btn .link-content{margin:0;padding:0}.sun-editor .sun-editor-id-link-btn .link-content a{display:inline-block;margin-left:5px;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.sun-editor .sun-editor-tab-button{border-bottom:1px solid #e5e5e5;height:25px;width:100%}.sun-editor .sun-editor-tab-button button{background-color:#e5e5e5;border-right:1px solid #e5e5e5;float:left;outline:none;padding:2px 13px;transition:.3s}.sun-editor .sun-editor-tab-button button:hover{background-color:#fff}.sun-editor .sun-editor-tab-button button.active{background-color:#fff;border-bottom:0}.sun-editor .sun-editor-id-notice{background-color:#f2dede;border:1px solid #eed3d7;color:#b94a48;display:none;font-size:13px;height:auto;margin:0;padding:15px;position:relative;width:100%;word-break:break-all}.sun-editor .sun-editor-id-notice button{float:right}.sun-editor-editable{background-color:#fff;color:#000;font-family:Helvetica Neue,sans-serif;font-size:13px;margin:0;padding:10px 20px;text-align:left;word-break:break-all}.sun-editor-editable *{background-color:inherit;box-sizing:border-box;color:inherit;font-family:inherit;font-size:inherit}.sun-editor-editable figcaption,.sun-editor-editable figure,.sun-editor-editable iframe,.sun-editor-editable img,.sun-editor-editable td,.sun-editor-editable th{position:relative}.sun-editor-editable .float-left{float:left}.sun-editor-editable .float-right{float:right}.sun-editor-editable .float-center{float:center}.sun-editor-editable .float-none{float:none}.sun-editor-editable a{color:#004cff;text-decoration:none}.sun-editor-editable a:focus,.sun-editor-editable a:hover{color:#0093ff;cursor:pointer;text-decoration:underline}.sun-editor-editable pre{background-color:#f6f8fa;border:1px solid #dce5e5;border-radius:3px;color:#333;display:block;font-size:13px;line-height:1.45;margin:0;overflow:auto;padding:8px;word-break:break-all;word-wrap:break-word}.sun-editor-editable ol{list-style-type:decimal}.sun-editor-editable ol,.sun-editor-editable ul{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0;padding-inline-start:40px}.sun-editor-editable ul{list-style-type:disc}.sun-editor-editable li{display:list-item;margin-bottom:5px;text-align:-webkit-match-parent}.sun-editor-editable sub,.sun-editor-editable sup{font-size:75%;line-height:0}.sun-editor-editable sub{vertical-align:sub}.sun-editor-editable sup{vertical-align:super}.sun-editor-editable p{display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable div{display:block;margin:0;padding:0}.sun-editor-editable blockquote{border-color:#8baab7;border-style:solid;border-width:0 0 0 5px;display:block;margin-block-end:1em;margin-block-start:1em;margin-inline-end:40px;margin-inline-start:40px;padding:0 5px 0 20px}.sun-editor-editable blockquote blockquote{border-color:#a2bfcc}.sun-editor-editable blockquote blockquote blockquote{border-color:#bbd5e0}.sun-editor-editable blockquote blockquote blockquote blockquote{border-color:#d4e3ea}.sun-editor-editable h1{font-size:2em;margin-block-end:.67em;margin-block-start:.67em}.sun-editor-editable h1,.sun-editor-editable h2{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h2{font-size:1.5em;margin-block-end:.83em;margin-block-start:.83em}.sun-editor-editable h3{font-size:1.17em;margin-block-end:1em;margin-block-start:1em}.sun-editor-editable h3,.sun-editor-editable h4{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h4{margin-block-end:1.33em;margin-block-start:1.33em}.sun-editor-editable h5{font-size:.83em;margin-block-end:1.67em;margin-block-start:1.67em}.sun-editor-editable h5,.sun-editor-editable h6{display:block;font-weight:700;margin-inline-end:0;margin-inline-start:0}.sun-editor-editable h6{font-size:.67em;margin-block-end:2.33em;margin-block-start:2.33em}.sun-editor-editable hr{border-color:#000;border-image:initial;border-width:1px 0 0;display:block;height:1px}.sun-editor-editable hr.solid{border-style:solid none none}.sun-editor-editable hr.dotted{border-style:dotted none none}.sun-editor-editable hr.dashed{border-style:dashed none none}.sun-editor-editable img.inner-link{margin:1px;outline:1px solid #a2bfcc;padding:1px}.sun-editor-editable table{background-color:transparent;border:1px solid #ccc;border-collapse:collapse;border-spacing:0;display:table;margin-bottom:20px;max-width:100%;table-layout:auto;width:100%}.sun-editor-editable table tr{border:1px solid #ccc}.sun-editor-editable table td{border:1px solid #ccc;padding:8px}.sun-editor-editable table td.sun-editor-selected-cell{outline:2px solid #8baab7}.sun-editor-editable .sun-editor-id-comp{display:flex;padding:1px}.sun-editor-editable[contenteditable=true] .sun-editor-id-comp{outline:1px dashed #ccc}.sun-editor-editable figure.sun-editor-figure-cover{display:block;margin:0;outline:none;padding:0}.sun-editor-editable figure.sun-editor-figure-cover figcaption{background-color:#f3f3f3;font-size:13px;margin:0;outline:none;padding:1em .5em}.sun-editor-editable figure.sun-editor-figure-cover figcaption p{line-height:2;margin:0}.sun-editor-editable .sun-editor-id-image-container a img{margin:1px;outline:1px solid #8baab7;padding:1px}.sun-editor-editable .sun-editor-id-iframe-container iframe{outline:1px solid #9e9e9e}.sun-editor-editable .sun-editor-id-iframe-inner-resizing-cover{display:none}.sun-editor-editable[contenteditable=true] .sun-editor-id-iframe-inner-resizing-cover{background-color:transparent;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.sun-editor-show-block div,.sun-editor-show-block h1,.sun-editor-show-block h2,.sun-editor-show-block h3,.sun-editor-show-block h4,.sun-editor-show-block h5,.sun-editor-show-block h6,.sun-editor-show-block p{border:1px dashed #a2bfcc;padding:10px 8px 8px}.sun-editor-show-block p{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAAPAQMAAAAF7dc0AAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAaSURBVAjXY/j/gwGCPvxg+F4BQiAGDP1HQQByxxw0gqOzIwAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block div{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAPAQMAAAAxlBYoAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j//wcDDH+8XsHwDYi/hwNx1A8w/nYLKH4XoQYJAwCXnSgcl2MOPgAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h1{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAfSURBVAjXY/j/v4EBhr+9B+LzEPrDeygfhI8j1CBhAEhmJGY4Rf6uAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h2{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAmSURBVAjXY/j/v4EBhr+dB+LtQPy9geEDEH97D8T3gbgdoQYJAwA51iPuD2haEAAAAABJRU5ErkJggg==") no-repeat}.sun-editor-show-block h3{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQPy9geHDeQgN5p9HqEHCADeWI+69VG2MAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h4{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAPAQMAAADTSA1RAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j//wADDH97DsTXIfjDdiDdDMTfIRhZHRQDAKJOJ6L+K3y7AAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h5{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAlSURBVAjXY/j/v4EBhr+1A/F+IO5vYPiwHUh/B2IQfR6hBgkDABlWIy5uM+9GAAAAAElFTkSuQmCC") no-repeat}.sun-editor-show-block h6{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAPAQMAAAA4f7ZSAAAABlBMVEWAgID////n1o2sAAAAAnRSTlP/AOW3MEoAAAAiSURBVAjXY/j/v4EBhr+dB+LtQLy/geFDP5S9HSKOrA6KAR9GIza1ptJnAAAAAElFTkSuQmCC") no-repeat} \ No newline at end of file diff --git a/dist/suneditor.min.js b/dist/suneditor.min.js index 17a0f107a..724e9e693 100644 --- a/dist/suneditor.min.js +++ b/dist/suneditor.min.js @@ -1 +1 @@ -!function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s="XJR1")}({"0A7J":function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_colorPicker__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("EjF6");__webpack_exports__.a={name:"fontColor",add:function(core,targetElement){core.addModule([_modules_colorPicker__WEBPACK_IMPORTED_MODULE_1__.a]);const context=core.context;context.fontColor={previewEl:null,colorInput:null};let listDiv=eval(this.setSubmenu(context.colorPicker.colorListHTML));context.fontColor.colorInput=listDiv.getElementsByClassName("sun-editor-id-submenu-color-input")[0],context.fontColor.colorInput.addEventListener("keyup",this.onChangeInput.bind(core)),listDiv.getElementsByClassName("sun-editor-id-submenu-color-submit")[0].addEventListener("click",this.submit.bind(core)),listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-submenu layer_editor",t.style.display="none",t.innerHTML=e,t},on:function(){const e=this.context.colorPicker;e._colorInput=this.context.fontColor.colorInput,e._defaultColor="#000000",e._styleProperty="color",this.plugins.colorPicker.init.call(this,this.getSelectionNode(),null)},onChangeInput:function(e){this.plugins.colorPicker.setCurrentColor.call(this,"#"+e.target.value)},submit:function(){this.plugins.fontColor.applyColor.call(this,this.context.colorPicker._currentColor)},pickup:function(e){if(e.preventDefault(),e.stopPropagation(),!/^BUTTON$/i.test(e.target.tagName))return!1;this.plugins.fontColor.applyColor.call(this,e.target.getAttribute("data-value"))},applyColor:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");t.style.color=e,this.nodeChange(t,["color"]),this.submenuOff(),this.focus()}}},"1kvd":function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"dialog",add:function(e){const t=e.context;t.dialog={};let i=n.a.createElement("DIV");i.className="sun-editor-id-dialogBox sun-editor-common";let o=n.a.createElement("DIV");o.className="modal-dialog-background sun-editor-id-dialog-back",o.style.display="none";let l=n.a.createElement("DIV");l.className="modal-dialog sun-editor-id-dialog-modal",l.style.display="none",i.appendChild(o),i.appendChild(l),t.dialog.modalArea=i,t.dialog.back=o,t.dialog.modal=l,t.dialog.modal.addEventListener("click",this.onClick_dialog.bind(e)),t.element.relative.appendChild(i),i=null,o=null,l=null},onClick_dialog:function(e){e.stopPropagation(),(/modal-dialog/.test(e.target.className)||/close/.test(e.target.getAttribute("data-command")))&&this.plugins.dialog.close.call(this)},open:function(e,t){if(this.modalForm)return!1;this.context.dialog.updateModal=t,"full"===this.context.option.popupDisplay?this.context.dialog.modalArea.style.position="fixed":this.context.dialog.modalArea.style.position="absolute",this.context.dialog.kind=e,this.modalForm=this.context[e].modal;const i=this.context[e].focusElement;this.context.dialog.modalArea.style.display="block",this.context.dialog.back.style.display="block",this.context.dialog.modal.style.display="block",this.modalForm.style.display="block",i&&i.focus()},close:function(){this.modalForm.style.display="none",this.context.dialog.back.style.display="none",this.context.dialog.modalArea.style.display="none",this.modalForm=null,this.context.dialog.updateModal=!1,this.plugins[this.context.dialog.kind].init.call(this)}}},"3FqI":function(e,t,i){},"50IV":function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"font",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.context.option));listDiv.getElementsByClassName("list_family")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");let i,n,o,l;t.className="layer_editor",t.style.display="none";let a=e.font?e.font:["Arial","Comic Sans MS","Courier New,Courier","Impact,Charcoal,sans-serif","Georgia","tahoma","Trebuchet MS,Helvetica","Verdana"],s='
",s+="
",t.innerHTML=s,t},pickup:function(e){if(!/^BUTTON$/i.test(e.target.tagName))return!1;e.preventDefault(),e.stopPropagation();const t=e.target;_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.tool.font,t.getAttribute("data-txt"));const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");i.style.fontFamily=t.getAttribute("data-value"),this.nodeChange(i,["font-family"]),this.submenuOff(),this.focus()}}},"8e1d":function(e,t,i){"use strict";const n={_d:document,_w:window,zeroWidthSpace:"​",getXMLHttpRequest:function(){if(!this._w.ActiveXObject)return this._w.XMLHttpRequest?new XMLHttpRequest:null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(e){try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){return null}}},copyObj:function(e){const t={};for(let i in e)t[i]=e[i];return t},createElement:function(e){return this._d.createElement(e)},createTextNode:function(e){return this._d.createTextNode(e||"")},getIncludePath:function(e,t){let i="";const n=[],o="js"===t?"script":"link",l="js"===t?"src":"href";let a="(?:";for(let t=0,i=e.length;t0?n[0][l]:""),-1===i.indexOf(":/")&&"//"!==i.slice(0,2)&&(i=0===i.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+i:location.href.match(/^[^\?]*\/(?:)/)[0]+i),!i)throw"[SUNEDITOR.util.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (name: +"+name+", extension: "+t+")";return i},convertContentsForEditor:function(e){let t,i,n="";e=e.trim();for(let o=0,l=(t=this._d.createRange().createContextualFragment(e).childNodes).length;o0&&(n+="

"+t+"

")}else n+=i;const o={"&":"&"," ":" ","'":""","<":"<",">":">"};return e=e.replace(/&|\u00A0|'|<|>/g,function(e){return"string"==typeof o[e]?o[e]:e}),0===n.length&&(n="

"+(e.length>0?e:this.zeroWidthSpace)+"

"),n},convertHTMLForCodeView:function(e){return e.replace(/\s*<(?:li|td)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,this._insertIndent).replace(/<\/?(?:blockquote|hr|ol|ul|table|tbody|thead|th|tr)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>(?=[^\n])/gi,this._insertLineBreak).replace(/<\/(?:p|div|h[1-6]|li|td|pre)>(?=[^\n])/gi,this._insertLineBreak)},_insertIndent:function(e){return" "+e.trim()},_insertLineBreak:function(e){return e+"\n"},isWysiwygDiv:function(e){return!(!e||1!==e.nodeType||!this.hasClass(e,"sun-editor-id-wysiwyg"))},isFormatElement:function(e){return!(!e||1!==e.nodeType||!/^(?:P|DIV|H[1-6]|LI|CODE)$/i.test(e.nodeName)||/sun-editor-id-comp/.test(e.className))},isRangeFormatElement:function(e){return!(!e||1!==e.nodeType||!/^(?:BLOCKQUOTE|TABLE|THEAD|TBODY|TH|TR|TD|OL|UL|PRE|FIGCAPTION)$/i.test(e.nodeName))},getFormatElement:function(e){if(!e)return null;for(;!this.isFormatElement(e)&&!this.isWysiwygDiv(e.parentNode);)e=e.parentNode;if(this.isWysiwygDiv(e)||this.isRangeFormatElement(e)){return this.getListChildren(e,function(e){return this.isFormatElement(e)}.bind(this))[0]}return e},getRangeFormatElement:function(e){if(!e)return null;for(;!this.isRangeFormatElement(e)&&!this.isWysiwygDiv(e);)e=e.parentNode;return this.isWysiwygDiv(e)?null:e},getArrayIndex:function(e,t){let i=-1;for(let n=0,o=e.length;n]*"?)?\s*/gi,"").replace(/<\/?(?:span|font)\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,"").replace(/<\/?[a-z]+:[a-z]+\s*(?:[a-z\-]+)?\s*(?:="?[^>]*"?)?\s*>/gi,""):n+=i[e].textContent;return n||e}};t.a=n},EjF6:function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"colorPicker",add:function(e){const t=e.context;t.colorPicker={colorListHTML:"",_colorInput:"",_defaultColor:"#000",_styleProperty:"color",_currentColor:""};let i=this.createColorList(e.context.option,e.lang);t.colorPicker.colorListHTML=i,i=null},createColorList:function(e,t){const i=e.colorList?e.colorList:["#ff0000","#ff5e00","#ffe400","#abf200","#00d8ff","#0055ff","#6600ff","#ff00dd","#000000","#ffd8d8","#fae0d4","#faf4c0","#e4f7ba","#d4f4fa","#d9e5ff","#e8d9ff","#ffd9fa","#ffffff","#ffa7a7","#ffc19e","#faed7d","#cef279","#b2ebf4","#b2ccff","#d1b2ff","#ffb2f5","#bdbdbd","#f15f5f","#f29661","#e5d85c","#bce55c","#5cd1e5","#6699ff","#a366ff","#f261df","#8c8c8c","#980000","#993800","#998a00","#6b9900","#008299","#003399","#3d0099","#990085","#353535","#670000","#662500","#665c00","#476600","#005766","#002266","#290066","#660058","#222222"];let n='
    ';for(let e=0,t=i.length;e '}return n+='
"},init:function(e,t){const i=this.plugins.colorPicker;let n=t||(i.getColorInNode.call(this,e)||this.context.colorPicker._defaultColor);n=i.isHexColor(n)?n:i.rgb2hex(n),i.setInputText.call(this,n)},setCurrentColor:function(e){this.context.colorPicker._currentColor=e,this.context.colorPicker._colorInput.style.borderColor=e},setInputText:function(e){this.context.colorPicker._colorInput.value=e.replace("#",""),this.plugins.colorPicker.setCurrentColor.call(this,e)},getColorInNode:function(e){let t="";const i=this.context.colorPicker._styleProperty;for(;!n.a.isWysiwygDiv(e)&&0===t.length;)1===e.nodeType&&e.style[i]&&(t=e.style[i]),e=e.parentNode;return t},isHexColor:function(e){return/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i.test(e)},rgb2hex:function(e){return(e=e.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i))&&4===e.length?"#"+("0"+parseInt(e[1],10).toString(16)).slice(-2)+("0"+parseInt(e[2],10).toString(16)).slice(-2)+("0"+parseInt(e[3],10).toString(16)).slice(-2):""}}},KKur:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_dialog__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("1kvd"),_modules_resizing__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__("ee5k"),_modules_notice__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__("PAX9");__webpack_exports__.a={name:"image",add:function(core){core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_1__.a,_modules_resizing__WEBPACK_IMPORTED_MODULE_2__.a,_modules_notice__WEBPACK_IMPORTED_MODULE_3__.a]);const context=core.context;context.image={_linkElement:null,_container:null,_cover:null,_element:null,_element_w:1,_element_h:1,_element_l:0,_element_t:0,_origin_w:"auto"===context.option.imageWidth?"":context.option.imageWidth,_origin_h:"",_altText:"",_caption:null,captionCheckEl:null,_linkValue:"",_align:"none",_captionChecked:!1,_proportionChecked:!0,_floatClassRegExp:"float\\-[a-z]+",_xmlHttp:null,_resizing:context.option.imageResizing,_defaultAuto:"auto"===context.option.imageWidth};let image_dialog=eval(this.setDialog(core.context.option,core.lang));context.image.modal=image_dialog,context.image.imgUrlFile=image_dialog.getElementsByClassName("sun-editor-id-image-url")[0],context.image.imgInputFile=context.image.focusElement=image_dialog.getElementsByClassName("sun-editor-id-image-file")[0],context.image.altText=image_dialog.getElementsByClassName("sun-editor-id-image-alt")[0],context.image.imgLink=image_dialog.getElementsByClassName("sun-editor-id-image-link")[0],context.image.imgLinkNewWindowCheck=image_dialog.getElementsByClassName("sun-editor-id-linkCheck")[0],context.image.captionCheckEl=image_dialog.getElementsByClassName("suneditor-id-image-check-caption")[0],context.image.modal.getElementsByClassName("sun-editor-tab-button")[0].addEventListener("click",this.openTab.bind(core)),context.image.modal.getElementsByClassName("btn-primary")[0].addEventListener("click",this.submit.bind(core)),context.image.imageX={},context.image.imageY={},context.option.imageResizing&&(context.image.proportion=image_dialog.getElementsByClassName("suneditor-id-image-check-proportion")[0],context.image.imageX=image_dialog.getElementsByClassName("sun-editor-id-image-x")[0],context.image.imageY=image_dialog.getElementsByClassName("sun-editor-id-image-y")[0],context.image.imageX.value=context.option.imageWidth,context.image.imageX.addEventListener("change",this.setInputSize.bind(core,"x")),context.image.imageY.addEventListener("change",this.setInputSize.bind(core,"y")),image_dialog.getElementsByClassName("sun-editor-id-image-revert-button")[0].addEventListener("click",this.sizeRevert.bind(core))),context.dialog.modal.appendChild(image_dialog),image_dialog=null},setDialog:function(e,t){const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");i.className="modal-content sun-editor-id-dialog-image",i.style.display="none";let n='
",i.innerHTML=n,i},openTab:function(e){const t=this.context.image.modal,i="init"===e?t.getElementsByClassName("sun-editor-id-tab-link")[0]:e.target;if(!/^BUTTON$/i.test(i.tagName))return!1;const n=i.getAttribute("data-tab-link");let o,l,a;for(l=t.getElementsByClassName("sun-editor-id-tab-content"),o=0;o0){const t=this.context.option.imageUploadUrl,i=this.context.dialog.updateModal?1:e.length;if(null!==t&&t.length>0){const n=new FormData;for(let t=0;t0?1:s.length;a0){const n=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("A");return n.href=/^https?:\/\//.test(t)?t:"http://"+t,n.target=i?"_blank":"",n.setAttribute("data-image-link","image"),e.setAttribute("data-image-link",t),n.appendChild(e),n}return e},setInputSize:function(e){this.context.dialog.updateModal&&this.context.image.proportion.checked&&("x"===e?this.context.image.imageY.value=Math.round(this.context.image._element_h/this.context.image._element_w*this.context.image.imageX.value):this.context.image.imageX.value=Math.round(this.context.image._element_w/this.context.image._element_h*this.context.image.imageY.value))},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation(),this.context.image._linkValue=this.context.image.imgLink.value,this.context.image._altText=this.context.image.altText.value,this.context.image._align=this.context.image.modal.querySelector('input[name="suneditor_image_radio"]:checked').value,this.context.image._captionChecked=this.context.image.captionCheckEl.checked,this.context.image._resizing&&(this.context.image._proportionChecked=this.context.image.proportion.checked);try{this.context.dialog.updateModal&&this.plugins.image.update_image.call(this),this.context.image.imgInputFile&&this.context.image.imgInputFile.files.length>0?this.plugins.image.onRender_imgInput.call(this):this.context.image.imgUrlFile&&this.context.image.imgUrlFile.value.trim().length>0?this.plugins.image.onRender_imgUrl.call(this):this.closeLoading()}catch(e){throw this.closeLoading(),_modules_notice__WEBPACK_IMPORTED_MODULE_3__.a.open.call(this,'[SUNEDITOR.image.submit.fail] cause : "'+e.message+'"'),Error('[SUNEDITOR.image.submit.fail] cause : "'+e.message+'"')}finally{this.plugins.dialog.close.call(this)}return!1},_onload_image:function(e,t){if(/\d+/.test(e.style.width)&&(e.style.height=e.offsetHeight+"px"),e.setAttribute("origin-size",e.naturalWidth+","+e.naturalHeight),e.setAttribute("data-origin",e.offsetWidth+","+e.offsetHeight),!t)return;let i=e.getAttribute("data-index");if(i){const t=this._variable._imagesInfo[i];t.name=e.getAttribute("data-file-name"),t.size=1*e.getAttribute("data-file-size")}else i=this._variable._imageIndex,e.setAttribute("data-index",i),this._variable._imagesInfo[i]={index:i,name:t.name,size:t.size,select:function(){const t=this.plugins.resizing.call_controller_resize.call(this,e,"image");this.plugins.image.onModifyMode.call(this,e,t),e.scrollIntoView()}.bind(this),delete:this.plugins.image.destroy.bind(this,e)},this._variable._imageIndex++,e.setAttribute("data-file-name",t.name),e.setAttribute("data-file-size",t.size);this._imageUpload(e,i,!1)},create_image:function(e,t,i,n,o,l,a,s){if(l)return void(a.src=e);const r=this.context.image;let d=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("IMG");d.addEventListener("load",this.plugins.image._onload_image.bind(this,d,s)),d.src=e,d.setAttribute("data-align",o),d.alt=r._altText,(d=this.plugins.image.onRender_link(d,t,i)).setAttribute("data-rotate","0"),r._resizing&&(/\d+/.test(n)&&(d.style.width=n),d.setAttribute("data-proportion",r._proportionChecked));const c=this.plugins.resizing.set_cover.call(this,d),_=this.plugins.resizing.set_container.call(this,c,"sun-editor-id-image-container");r._captionChecked&&(r._caption=this.plugins.resizing.create_caption.call(this),r._caption.setAttribute("contenteditable",!1),c.appendChild(r._caption)),c.style.margin="none"!==o?"auto":"0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(_,r._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(_,"float-"+o),r._resizing&&/\d+/.test(n)||(this.context.resizing._resize_plugin="image",r._element=d,r._cover=c,r._container=_,this.plugins.image.setAutoSize.call(this)),this.insertNode(_,_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(this.getSelectionNode())),this.appendFormatTag(_)},update_image:function(){const e=this.context.image,t=e._linkValue;let i=e._element,n=e._cover,o=e._container,l=!1;const a=1*e.imageX.value!==i.offsetWidth||1*e.imageY.value!==i.offsetHeight;if(null===n&&(l=!0,i=e._element.cloneNode(!0),n=this.plugins.resizing.set_cover.call(this,i)),null===o&&(n=n.cloneNode(!0),l=!0,o=this.plugins.resizing.set_container.call(this,n,"sun-editor-id-image-container")),l&&(o.innerHTML="",o.appendChild(n)),i.alt=e._altText,e._resizing&&(i.setAttribute("data-proportion",e._proportionChecked),a&&this.plugins.image.setSize.call(this,e.imageX.value,e.imageY.value)),e._captionChecked?e._caption||(e._caption=this.plugins.resizing.create_caption.call(this),n.appendChild(e._caption)):e._caption&&(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(e._caption),e._caption=null),e._align&&"none"!==e._align?n.style.margin="auto":n.style.margin="0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(o,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(o,"float-"+e._align),i.setAttribute("data-align",e._align),t.trim().length>0)if(null!==e._linkElement)e._linkElement.href=t,e._linkElement.target=e.imgLinkNewWindowCheck.checked?"_blank":"",i.setAttribute("data-image-link",t);else{let o=this.plugins.image.onRender_link(i,t,this.context.image.imgLinkNewWindowCheck.checked);n.insertBefore(o,e._caption)}else if(null!==e._linkElement){const t=i;t.setAttribute("data-image-link","");let o=t.cloneNode(!0);n.removeChild(e._linkElement),n.insertBefore(o,e._caption),i=o}if(l){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(e._element);t.parentNode.insertBefore(o,t),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(t)}(e._resizing&&a||this.context.resizing._rotateVertical&&e._captionChecked)&&this.plugins.resizing.setTransformSize.call(this,i)},sizeRevert:function(){const e=this.context.image;e._origin_w&&(e.imageX.value=e._element_w=e._origin_w,e.imageY.value=e._element_h=e._origin_h)},onModifyMode:function(e,t){const i=this.context.image;i._linkElement=/^A$/i.test(e.parentNode.nodeName)?e.parentNode:null,i._element=e,i._cover=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(e,".sun-editor-figure-cover"),i._container=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(e,".sun-editor-id-image-container"),i._caption=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getChildElement(i._cover,"FIGCAPTION"),i._align=e.getAttribute("data-align")||"none",i._element_w=t.w,i._element_h=t.h,i._element_t=t.t,i._element_l=t.l;let n=i._element.getAttribute("data-origin");n?(n=n.split(","),i._origin_w=1*n[0],i._origin_h=1*n[1]):(i._origin_w=t.w,i._origin_h=t.h,i._element.setAttribute("data-origin",t.w+","+t.h))},openModify:function(e){const t=this.context.image;t.imgUrlFile.value=t._element.src,t.altText.value=t._element.alt,t.imgLink.value=null===t._linkElement?"":t._linkElement.href,t.imgLinkNewWindowCheck.checked=t._linkElement&&"_blank"===t._linkElement.target,t.modal.querySelector('input[name="suneditor_image_radio"][value="'+t._align+'"]').checked=!0,t._captionChecked=t.captionCheckEl.checked=!!t._caption,t._resizing&&(t.proportion.checked=t._proportionChecked="true"===t._element.getAttribute("data-proportion"),t.imageX.value=t._element.offsetWidth,t.imageY.value=t._element.offsetHeight,t.imageX.disabled=!1,t.imageY.disabled=!1,t.proportion.disabled=!1),e||this.plugins.dialog.open.call(this,"image",!0)},setSize:function(e,t){const i=this.context.image;i._element.style.width=e+"px",i._element.style.height=t+"px"},setAutoSize:function(){const e=this.context.image;this.plugins.resizing.resetTransform.call(this,e._element),this.plugins.image.cancelPercentAttr.call(this),e._element.style.maxWidth="100%",e._element.style.width="100%",e._element.style.height="",e._cover.style.width="",e._cover.style.height=""},setPercentSize:function(e){const t=this.context.image;t._container.style.width=e,t._container.style.height="",t._cover.style.width="100%",t._cover.style.height="",t._element.style.width="100%",t._element.style.height="",/100/.test(e)&&(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(t._container,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(t._container,"float-center"))},cancelPercentAttr:function(){const e=this.context.image;e._element.style.maxWidth="none",e._cover.style.width="",e._cover.style.height="",e._container.style.width="",e._container.style.height="",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._container,this.context.image._floatClassRegExp),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(e._container,"float-"+e._align)},resetAlign:function(){const e=this.context.image;e._element.setAttribute("data-align",""),e._align="none",e._cover.style.margin="0",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._container,e._floatClassRegExp)},destroy:function(e){const t=e||this.context.image._element,i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getParentElement(t,".sun-editor-id-image-container")||t,n=t.getAttribute("data-index");_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(i),this.plugins.image.init.call(this),this.controllersOff(),n&&(delete this._variable._imagesInfo[n],this._imageUpload(t,n,!0))},init:function(){const e=this.context.image;if(e.imgInputFile&&(e.imgInputFile.value=""),e.imgUrlFile&&(e.imgUrlFile.value=""),e.altText.value="",e.imgLink.value="",e.imgLinkNewWindowCheck.checked=!1,e.modal.querySelector('input[name="suneditor_image_radio"][value="none"]').checked=!0,e.captionCheckEl.checked=!1,e._element=null,this.plugins.image.openTab.call(this,"init"),e._resizing){const t="auto"===this.context.option.imageWidth;e.proportion.checked=!1,e.imageX.value=t?"":this.context.option.imageWidth,e.imageY.value="",e.imageX.disabled=t,e.imageY.disabled=!0,e.proportion.disabled=!0}}}},MIhV:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"fontSize",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.context.option));listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickup.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");t.className="sun-editor-submenu layer_editor layer_size",t.style.display="none";const i=e.fontSize?e.fontSize:[8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72];let n='
    ';for(let e=0,t=i.length;e"}return n+="
",t.innerHTML=n,t},pickup:function(e){if(e.preventDefault(),e.stopPropagation(),!/^BUTTON$/i.test(e.target.tagName))return!1;_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.tool.fontSize,e.target.getAttribute("data-value"));const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("SPAN");t.style.fontSize=e.target.getAttribute("data-value")+"px",this.nodeChange(t,["font-size"]),this.submenuOff(),this.focus()}}},PAX9:function(e,t,i){"use strict";var n=i("8e1d");t.a={name:"notice",add:function(e){const t=e.context;t.notice={};let i=n.a.createElement("DIV"),o=n.a.createElement("SPAN"),l=n.a.createElement("BUTTON");i.className="sun-editor-id-notice",l.className="close",l.setAttribute("aria-label","Close"),l.setAttribute("title",e.lang.dialogBox.close),l.innerHTML='',i.appendChild(o),i.appendChild(l),t.notice.modal=i,t.notice.message=o,l.addEventListener("click",this.onClick_cancel.bind(e)),t.element.editorArea.insertBefore(i,t.element.wysiwyg),i=null},onClick_cancel:function(e){e.preventDefault(),e.stopPropagation(),this.plugins.notice.close.call(this)},open:function(e){this.context.notice.message.textContent=e,this.context.notice.modal.style.display="block"},close:function(){this.context.notice.modal.style.display="none"}}},Rp48:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d"),_modules_dialog__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__("1kvd");__webpack_exports__.a={name:"link",add:function(core){core.addModule([_modules_dialog__WEBPACK_IMPORTED_MODULE_1__.a]);const context=core.context;context.link={};let link_dialog=eval(this.setDialog(core.lang));context.link.modal=link_dialog,context.link.focusElement=link_dialog.getElementsByClassName("sun-editor-id-link-url")[0],context.link.linkAnchorText=link_dialog.getElementsByClassName("sun-editor-id-link-text")[0],context.link.linkNewWindowCheck=link_dialog.getElementsByClassName("sun-editor-id-link-check")[0];let link_button=eval(this.setController_LinkButton(core.lang));context.link.linkBtn=link_button,context.link._linkAnchor=null,link_button.addEventListener("mousedown",function(e){e.stopPropagation()},!1),link_dialog.getElementsByClassName("btn-primary")[0].addEventListener("click",this.submit.bind(core)),link_button.addEventListener("click",this.onClick_linkBtn.bind(core)),context.dialog.modal.appendChild(link_dialog),context.element.relative.appendChild(link_button),link_dialog=null,link_button=null},setDialog:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="modal-content sun-editor-id-dialog-link",t.style.display="none",t.innerHTML='",t},setController_LinkButton:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-id-link-btn",t.style.display="none",t.innerHTML='
',t},submit:function(e){this.showLoading(),e.preventDefault(),e.stopPropagation();const t=function(){if(0===this.context.link.focusElement.value.trim().length)return!1;const e=this.context.link.focusElement.value,t=this.context.link.linkAnchorText,i=0===t.value.length?e:t.value;if(this.context.dialog.updateModal)this.context.link._linkAnchor.href=e,this.context.link._linkAnchor.textContent=i,this.context.link._linkAnchor.target=this.context.link.linkNewWindowCheck.checked?"_blank":"",this.setRange(this.context.link._linkAnchor.childNodes[0],0,this.context.link._linkAnchor.childNodes[0],this.context.link._linkAnchor.textContent.length);else{const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("A");t.href=e,t.textContent=i,t.target=this.context.link.linkNewWindowCheck.checked?"_blank":"",this.insertNode(t),this.setRange(t.childNodes[0],0,t.childNodes[0],t.textContent.length)}this.context.link.focusElement.value="",this.context.link.linkAnchorText.value=""}.bind(this);try{t()}finally{this.plugins.dialog.close.call(this),this.closeLoading(),this.focus()}return!1},call_controller_linkButton:function(e){this.editLink=this.context.link._linkAnchor=e;const t=this.context.link.linkBtn;t.getElementsByTagName("A")[0].href=e.href,t.getElementsByTagName("A")[0].textContent=e.textContent;const i=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getOffset(e);t.style.left=i.left-this.context.element.wysiwyg.scrollLeft+"px",t.style.top=i.top+e.offsetHeight+10+"px",t.style.display="block",this.controllersOn(t)},onClick_linkBtn:function(e){e.stopPropagation();const t=e.target.getAttribute("data-command")||e.target.parentNode.getAttribute("data-command");t&&(e.preventDefault(),/update/.test(t)?(this.context.link.focusElement.value=this.context.link._linkAnchor.href,this.context.link.linkAnchorText.value=this.context.link._linkAnchor.textContent,this.context.link.linkNewWindowCheck.checked=!!/_blank/i.test(this.context.link._linkAnchor.target),this.plugins.dialog.open.call(this,"link",!0)):(_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeItem(this.context.link._linkAnchor),this.context.link._linkAnchor=null,this.focus()),this.controllersOff())},init:function(){const e=this.context.link;e.linkBtn.style.display="none",e._linkAnchor=null,e.focusElement.value="",e.linkAnchorText.value="",e.linkNewWindowCheck.checked=!1}}},VquE:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"table",add:function(core,targetElement){const context=core.context;context.table={_element:null,_tdElement:null,_trElement:null,_trElements:null,_tdIndex:0,_trIndex:0,_tdCnt:0,_trCnt:0,_tableXY:[]};let listDiv=eval(this.setSubmenu()),tablePicker=listDiv.getElementsByClassName("sun-editor-id-table-picker")[0];context.table.tableHighlight=listDiv.getElementsByClassName("sun-editor-id-table-highlighted")[0],context.table.tableUnHighlight=listDiv.getElementsByClassName("sun-editor-id-table-unhighlighted")[0],context.table.tableDisplay=listDiv.getElementsByClassName("sun-editor-table-display")[0];let resizeDiv=eval(this.setController_tableEditor(core.lang));context.table.resizeDiv=resizeDiv,resizeDiv.addEventListener("mousedown",function(e){e.stopPropagation()},!1),tablePicker.addEventListener("mousemove",this.onMouseMove_tablePicker.bind(core)),tablePicker.addEventListener("click",this.appendTable.bind(core)),resizeDiv.addEventListener("click",this.onClick_resizeDiv.bind(core)),targetElement.parentNode.appendChild(listDiv),context.element.relative.appendChild(resizeDiv),listDiv=null,tablePicker=null,resizeDiv=null},setSubmenu:function(){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return e.className="sun-editor-submenu table-content",e.style.display="none",e.innerHTML='
1 x 1
',e},setController_tableEditor:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-id-table-edit",t.style.display="none",t.innerHTML='
',t},appendTable:function(){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("TABLE");let t=this.context.table._tableXY[0],i=this.context.table._tableXY[1],n="";for(;i>0;){n+="";let e=t;for(;e>0;)n+="
"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+"
",--e;n+="",--i}n+="",e.innerHTML=n;const o=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getFormatElement(this.getSelectionNode());this.insertNode(e,/^LI$/i.test(o.nodeName)?_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getRangeFormatElement(o):o),this.appendFormatTag(e),this.focus(),this.plugins.table.reset_table_picker.call(this)},onMouseMove_tablePicker:function(e){e.stopPropagation();let t=Math.ceil(e.offsetX/18),i=Math.ceil(e.offsetY/18);t=t<1?1:t,i=i<1?1:i,this.context.table.tableHighlight.style.width=t+"em",this.context.table.tableHighlight.style.height=i+"em";let n=t<5?5:t>9?10:t+1,o=i<5?5:i>9?10:i+1;this.context.table.tableUnHighlight.style.width=n+"em",this.context.table.tableUnHighlight.style.height=o+"em",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.table.tableDisplay,t+" x "+i),this.context.table._tableXY=[t,i]},reset_table_picker:function(){if(!this.context.table.tableHighlight)return;const e=this.context.table.tableHighlight.style,t=this.context.table.tableUnHighlight.style;e.width="1em",e.height="1em",t.width="5em",t.height="5em",_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.context.table.tableDisplay,"1 x 1"),this.submenuOff()},init:function(){const e=this.context.table;e._tdElement&&_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(e._tdElement,"sun-editor-selected-cell"),e._element=null,e._tdElement=null,e._trElement=null,e._trElements=0,e._tdIndex=0,e._trIndex=0,e._trCnt=0,e._tdCnt=0,e._tableXY=[]},call_controller_tableEdit:function(e){this.plugins.table.init.call(this);const t=this.context.table.resizeDiv;this.plugins.table.setPositionControllerDiv.call(this,e,!1),t.style.display="block",this.controllersOn(t)},setPositionControllerDiv:function(e,t){const i=this.context.table,n=i.resizeDiv;let o=i._element;if(!o){for(o=e;!/^TABLE$/i.test(o.nodeName);)o=o.parentNode;i._element=o}i._tdElement!==e&&(i._tdElement&&_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.removeClass(i._tdElement,"sun-editor-selected-cell"),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.addClass(e,"sun-editor-selected-cell"),i._tdElement=e,i._trElement=e.parentNode),(t||0===i._trCnt)&&(i._trElements=o.rows,i._tdIndex=e.cellIndex,i._trIndex=i._trElement.rowIndex,i._trCnt=o.rows.length,i._tdCnt=i._trElement.cells.length);const l=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.getOffset(e);n.style.left=l.left-this.context.element.wysiwyg.scrollLeft+"px",n.style.top=l.top+e.offsetHeight+12+"px"},insertRowCell:function(e,t){const i=this.context.table;if("row"===e){const e="up"===t?i._trIndex:i._trIndex+1;let n="";for(let e=0,t=i._tdCnt;e
"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+"
";i._element.insertRow(e).innerHTML=n}else{const e=i._trElements,n="left"===t?i._tdIndex:i._tdIndex+1;let o=null;for(let t=0,l=i._trCnt;t"+_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.zeroWidthSpace+""}this.plugins.table.setPositionControllerDiv.call(this,i._tdElement,!0)},deleteRowCell:function(e){const t=this.context.table;if("row"===e)t._element.deleteRow(t._trIndex);else{const e=t._trElements,i=t._tdIndex;for(let n=0,o=t._trCnt;n'+e.toolbar.alignLeft+'
  • ",t},pickup:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,i=null;for(;!i&&!/UL/i.test(t.tagName);)i=t.getAttribute("data-command"),t=t.parentNode;this.focus(),this.execCommand(i,!1,null),this.submenuOff()}}},WUQj:function(e,t,i){},WzUB:function(module,__webpack_exports__,__webpack_require__){"use strict";var _lib_util__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__("8e1d");__webpack_exports__.a={name:"formatBlock",add:function(core,targetElement){let listDiv=eval(this.setSubmenu(core.lang));listDiv.getElementsByTagName("UL")[0].addEventListener("click",this.pickUp.bind(core)),targetElement.parentNode.appendChild(listDiv),listDiv=null},setSubmenu:function(e){const t=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement("DIV");return t.className="sun-editor-submenu layer_editor layer_block",t.style.display="none",t.innerHTML='
    ",t},pickUp:function(e){e.preventDefault(),e.stopPropagation();let t=e.target,i=null,n=null;for(;!i&&!/UL/i.test(t.tagName);)i=t.getAttribute("data-command"),n=t.getAttribute("data-value"),t=t.parentNode;if("range"===i){const e=_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.createElement(n);this.wrapToTags(e),this.setRange(e.firstChild,0,e.firstChild,0),this.appendFormatTag(e,_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.isCell(this.getSelectionNode())?"DIV":"")}else this.execCommand("formatBlock",!1,n),_lib_util__WEBPACK_IMPORTED_MODULE_0__.a.changeTxt(this.commandMap.FORMAT,n);this.submenuOff(),this.focus()}}},XJR1:function(e,t,i){"use strict";i.r(t);i("3FqI"),i("WUQj");var n=i("WRt5"),o=i("50IV"),l=i("MIhV"),a=i("0A7J"),s=i("s0fJ"),r=i("g4XY"),d=i("gMuy"),c=i("VquE"),_=i("WzUB"),u=i("Rp48"),g=i("KKur"),m=i("hlhS"),h={align:n.a,font:o.a,fontSize:l.a,fontColor:a.a,hiliteColor:s.a,horizontalRule:r.a,list:d.a,table:c.a,formatBlock:_.a,link:u.a,image:g.a,video:m.a},p=i("8e1d"),f=i("PAX9");var b=function(e,t,i){const n=document,o=window,l={context:e,plugins:{},initPlugins:{},lang:i,dialogForm:null,_submenuName:"",submenu:null,_bindedSubmenuOff:null,submenuActiveButton:null,controllerArray:[],_bindControllersOff:null,codeViewDisabledButtons:e.element.toolbar.querySelectorAll('.sun-editor-id-toolbar button:not([class~="code-view-enabled"])'),_isInline:/inline/i.test(e.option.mode),_isBalloon:/balloon/i.test(e.option.mode),_inlineToolbarAttr:{width:0,height:0,isShow:!1},_imageUpload:function(e,t,i){s.onImageUpload&&s.onImageUpload(e,t,i)},commandMap:{FORMAT:e.tool.format,FONT:e.tool.font,SIZE:e.tool.fontSize,B:e.tool.bold,U:e.tool.underline,I:e.tool.italic,STRIKE:e.tool.strike,SUB:e.tool.subscript,SUP:e.tool.superscript},_variable:{wysiwygActive:!0,isFullScreen:!1,innerHeight_fullScreen:0,resizeClientY:0,tabSize:4,minResizingSize:65,currentNodes:[],_range:null,_selectionNode:null,_originCssText:e.element.topArea.style.cssText,_bodyOverflow:"",_editorAreaOriginCssText:"",_wysiwygOriginCssText:"",_codeOriginCssText:"",_sticky:!1,_imagesInfo:[],_imageIndex:0},callPlugin:function(e,t){if(!this.plugins[e])throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:"'+e+'")');this.initPlugins[e]||(this.plugins[e].add(this,this.plugins[e].buttonElement),this.initPlugins[e]=!0),t()},addModule:function(e){let t="";for(let i=0,n=e.length;i0){for(let t=0;t":i)},focus:function(){if("none"===e.element.wysiwyg.style.display)return;const t=p.a.getParentElement(this.getSelectionNode(),"figcaption");t?t.focus():e.element.wysiwyg.focus(),a._findButtonEffectTag()},setRange:function(e,t,i,l){const a=n.createRange();a.setStart(e,t),a.setEnd(i,l);const s=o.getSelection();s.removeAllRanges&&s.removeAllRanges(),s.addRange(a),this._editorRange()},getRange:function(){return this._variable._range||this._createDefaultRange()},getSelectionNode:function(){return this._variable._selectionNode||e.element.wysiwyg.firstChild},_editorRange:function(){const e=o.getSelection();if(!p.a.getParentElement(e.focusNode,".sun-editor-id-wysiwyg"))return;let t=null,i=null;t=e.rangeCount>0?e.getRangeAt(0):this._createDefaultRange(),this._variable._range=t,i=t.collapsed?t.commonAncestorContainer:e.extentNode||e.anchorNode,this._variable._selectionNode=i},_createDefaultRange:function(){const t=n.createRange();return t.setStart(e.element.wysiwyg.firstChild,0),t.setEnd(e.element.wysiwyg.firstChild,0),t},getSelectedFormatElements:function(){let t=this.getRange();if(p.a.isWysiwygDiv(t.startContainer)){const i=e.element.wysiwyg.children;this.setRange(i[0],0,i[i.length-1],i[i.length-1].textContent.length),t=this.getRange()}const i=t.startContainer,n=t.endContainer,o=t.commonAncestorContainer,l=[];if(!p.a.isWysiwygDiv(o)&&!p.a.isRangeFormatElement(o))return[p.a.getFormatElement(o)];const a=p.a.getListChildren(o,function(e){return p.a.isFormatElement(e)});if(i===n)return a[0];let s=p.a.getFormatElement(i),r=p.a.getFormatElement(n),d=0,c=0;for(let e=0,t=a.length;e=0;e--)r[e]===n.parentNode&&r[e].firstChild===n&&0===i&&(d=e,n=n.parentNode);for(let e=c-1,t=n;e>d;e--)r[e]===t.parentNode&&1===r[e].nodeType&&(r.splice(e,1),t=t.parentNode,--c);for(let e=d;e<=c;e++){const l=r[e];0===l.length||3===l.nodeType&&void 0===l.data?p.a.removeItem(l):l!==t?l!==n?p.a.removeItem(l):(s=1===n.nodeType?p.a.createTextNode(n.textContent):p.a.createTextNode(n.substringData(o,n.length-o))).length>0?n.data=s.data:p.a.removeItem(n):(a=1===t.nodeType?p.a.createTextNode(t.textContent):p.a.createTextNode(t.substringData(0,i))).length>0?t.data=a.data:p.a.removeItem(t)}},wrapToTags:function(e){const t=this.getRange(),i=this.getSelectedFormatElements();if(!i){const t=p.a.createElement(p.a.isCell(this.getSelectionNode())?"DIV":"P");return t.innerHTML=p.a.zeroWidthSpace,e.appendChild(t),void this.getSelectionNode().appendChild(e)}let n,o,l,a=i[i.length-1];n=p.a.isRangeFormatElement(a)||p.a.isFormatElement(a)?a:p.a.getRangeFormatElement(a)||p.a.getFormatElement(a),p.a.isCell(n)?(o=null,l=n):(o=n.nextSibling,l=n.parentNode);let s=null,r=null,d="";for(let t=0,n=i.length;t=i.length)return}}if(l=p.a.isWysiwygDiv(n.startContainer)?e.element.wysiwyg.firstChild:n.startContainer,a=n.startOffset,1===l.nodeType&&l.childNodes.length>0){for(;l&&!p.a.isBreak(l)&&1===l.nodeType;){r=[];for(let e=0,t=(s=l.childNodes).length;e0){for(;l&&!p.a.isBreak(l)&&1===l.nodeType;){r=[];for(let e=0,t=(s=l.childNodes).length;e0&&(t=e.style.cssText.replace(f,"").trim()),(t.length>0||e.nodeName!==m)&&(e.style.cssText.length>0&&(e.style.cssText=t),!0)};if(p.a.isWysiwygDiv(g)||p.a.isRangeFormatElement(g)){const e=this.getSelectedFormatElements(),i=e.length-1;h=t.cloneNode(!1),b=this._nodeChange_startLine(e[0],h,y,d,c,o);for(let n=1;n0?(h=t.cloneNode(!1),v=this._nodeChange_endLine(e[i],h,y,_,u,o)):v=b}else{h=t.cloneNode(!1);const e=this._nodeChange_oneLine(p.a.getFormatElement(g),h,y,d,c,_,u,o,n.collapsed);b.container=e.startContainer,b.offset=e.startOffset,v.container=e.endContainer,v.offset=e.endOffset}this.setRange(b.container,b.offset,v.container,v.offset)},_nodeChange_oneLine:function(e,t,i,n,o,l,a,s,r){const d=e,c=e.cloneNode(!1),_=n===l;let u,g,m,h,f=n,b=o,v=l,y=a,E=!1,x=!1;function C(e){const t=new RegExp("(?:;|^|\\s)(?:"+h+"null)\\s*:[^;]*\\s*(?:;|$)","ig");let i="";return t&&e.style.cssText.length>0&&(i=t.test(e.style.cssText)),!i}return function e(n,o){const l=n.childNodes;for(let n=0,a=l.length;nb?y-b:b-y));for(e.data.length>0&&o.appendChild(e),g=k,u=[],h="";g!==c&&g!==d&&null!==g;)i(g)&&1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const l=u.pop()||n;for(m=g=l;u.length>0;)g=u.pop(),m.appendChild(g),m=g;if(t.appendChild(l),c.appendChild(t),f=n,b=0,E=!0,g!==n&&g.appendChild(f),!_)continue}if(x||k!==v){if(E){if(1===k.nodeType&&!p.a.isBreak(k)){e(k,k);continue}for(g=k,u=[],h="";null!==g.parentNode&&g!==d&&g!==t;)1===g.nodeType&&!p.a.isBreak(k)&&(x||i(g))&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const n=u.pop()||k;for(m=g=n;u.length>0;)g=u.pop(),m.appendChild(g),m=g;n===k?o=x?c:t:x?(c.appendChild(n),o=g):(t.appendChild(n),o=g)}a=k.cloneNode(!1),o.appendChild(a),1!==k.nodeType||p.a.isBreak(k)||(w=a),e(k,w)}else{const e=p.a.createTextNode(1===v.nodeType?"":v.substringData(y,v.length-y)),n=p.a.createTextNode(_||1===v.nodeType?"":v.substringData(0,y));if(e.data.length>0){for(g=k,h="",u=[];g!==c&&g!==d&&null!==g;)1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;for(a=m=g=u.pop()||e;u.length>0;)g=u.pop(),m.appendChild(g),m=g;c.appendChild(a),g.textContent=e.data}for(g=k,u=[],h="";g!==c&&g!==d&&null!==g;)i(g)&&1===g.nodeType&&C(g)&&(u.push(g.cloneNode(!1)),h+=g.style.cssText.substr(0,g.style.cssText.indexOf(":"))+"|"),g=g.parentNode;const o=u.pop()||n;for(m=g=o;u.length>0;)g=u.pop(),m.appendChild(g),m=g;t.appendChild(o),v=n,y=n.data.length,x=!0,!s&&r&&(t=n,n.textContent=p.a.zeroWidthSpace),g!==n&&g.appendChild(v)}}}(e,c),s?(f=p.a.createTextNode(r?p.a.zeroWidthSpace:t.textContent),c.insertBefore(f,t),c.removeChild(t),r&&(b=1)):r&&(f=v=t,b=1,y=1),p.a.removeEmptyNode(c),e.parentNode.insertBefore(c,e),p.a.removeItem(e),{startContainer:f,startOffset:b,endContainer:s||!v.textContent?f:v,endOffset:s||!v.textContent?f.textContent.length:y}},_nodeChange_middleLine:function(e,t,i,n){n?t=p.a.createTextNode(e.textContent?e.textContent:p.a.zeroWidthSpace):function e(t,n){const o=t.childNodes;for(let t=0,l=o.length;t0){const e=r.pop();for(c=d=e;r.length>0;)d=r.pop(),c.appendChild(d),c=d;t.appendChild(e),o=d}else o=t}if(g||m!==_){if(!g||i(m)){const e=m.cloneNode(!1);o.appendChild(e),1!==m.nodeType||p.a.isBreak(m)||(h=e)}e(m,h)}else{const e=p.a.createTextNode(1===_.nodeType?"":_.substringData(0,u)),n=p.a.createTextNode(1===_.nodeType?"":_.substringData(u,_.length-u));for(e.data.length>0&&o.appendChild(e),d=o,r=[];d!==s&&null!==d;)1===d.nodeType&&i(d)&&r.push(d.cloneNode(!1)),d=d.parentNode;const l=r.pop()||o;for(c=d=l;r.length>0;)d=r.pop(),c.appendChild(d),c=d;l!==o?(t.appendChild(l),o=d):o=t,p.a.isBreak(m)&&t.appendChild(m.cloneNode(!1)),s.appendChild(t),_=n,u=0,g=!0,o.appendChild(_)}}}(e,s),l&&(_=p.a.createTextNode(t.textContent),s.insertBefore(_,t),s.removeChild(t)),l||0!==s.children.length?(p.a.removeEmptyNode(s),e.parentNode.insertBefore(s,e),p.a.removeItem(e)):e.childNodes?_=e.childNodes[0]:(_=p.a.createTextNode(p.a.zeroWidthSpace),e.appendChild(_)),{container:_,offset:u}},_nodeChange_endLine:function(e,t,i,n,o,l){const a=e,s=e.cloneNode(!1);let r,d,c,_=n,u=o,g=!1;return function e(n,o){const l=n.childNodes;for(let n=l.length-1;0<=n;n--){const m=l[n];let h=o;if(g&&!p.a.isBreak(m)){if(1===m.nodeType){e(m,m);continue}for(d=m,r=[];null!==d.parentNode&&d!==a&&d!==t;)i(d)&&1===d.nodeType&&r.push(d.cloneNode(!1)),d=d.parentNode;if(r.length>0){const e=r.pop();for(c=d=e;r.length>0;)d=r.pop(),c.appendChild(d),c=d;t.insertBefore(e,t.firstChild),o=d}else o=t}if(g||m!==_){if(!g||i(m)){const e=m.cloneNode(!1);o.insertBefore(e,o.firstChild),1!==m.nodeType||p.a.isBreak(m)||(h=e)}e(m,h)}else{const e=p.a.createTextNode(1===_.nodeType?"":_.substringData(u,_.length-u)),n=p.a.createTextNode(1===_.nodeType?"":_.substringData(0,u));for(e.data.length>0&&o.insertBefore(e,o.firstChild),d=o,r=[];d!==s&&null!==d;)i(d)&&1===d.nodeType&&r.push(d.cloneNode(!1)),d=d.parentNode;const l=r.pop()||o;for(c=d=l;r.length>0;)d=r.pop(),c.appendChild(d),c=d;l!==o?(t.insertBefore(l,t.firstChild),o=d):o=t,p.a.isBreak(m)&&t.appendChild(m.cloneNode(!1)),s.insertBefore(t,s.firstChild),_=n,u=n.data.length,g=!0,o.insertBefore(_,o.firstChild)}}}(e,s),l&&(_=p.a.createTextNode(t.textContent),u=_.textContent.length,s.insertBefore(_,t),s.removeChild(t)),l||0!==s.childNodes.length?(p.a.removeEmptyNode(s),e.parentNode.insertBefore(s,e),p.a.removeItem(e)):e.childNodes?_=e.childNodes[0]:(_=p.a.createTextNode(p.a.zeroWidthSpace),e.appendChild(_)),{container:_,offset:u}},commandHandler:function(t,i){switch(i){case"codeView":this.controllersOff(),this.toggleCodeView(),p.a.toggleClass(t,"on");break;case"fullScreen":this.controllersOff(),this.toggleFullScreen(t),p.a.toggleClass(t,"on");break;case"indent":case"outdent":this.indent(i);break;case"redo":case"undo":this.execCommand(i,!1,null);break;case"removeFormat":this.removeFormat();break;case"preview":case"print":this.openWindowContents(i);break;case"showBlocks":this.toggleDisplayBlocks(),p.a.toggleClass(t,"on");break;case"subscript":p.a.hasClass(e.tool.superscript,"on")&&(this.execCommand("superscript",!1,null),p.a.removeClass(e.tool.superscript,"on")),this.execCommand(i,!1,null),p.a.toggleClass(t,"on");break;case"superscript":p.a.hasClass(e.tool.subscript,"on")&&(this.execCommand("subscript",!1,null),p.a.removeClass(e.tool.subscript,"on")),this.execCommand(i,!1,null),p.a.toggleClass(t,"on");break;default:this.execCommand(i,!1,t.getAttribute("data-value")),p.a.toggleClass(t,"on")}this.focus()},removeFormat:function(){this.nodeChange(p.a.createElement("REMOVENODE"))},indent:function(e){const t=this.getSelectedFormatElements();let i,n;for(let o=0,l=t.length;o0?e.element.code.scrollHeight+"px":"auto"),this._variable.wysiwygActive=!1,e.element.code.focus();else{const t=e.element.code.value.trim();e.element.wysiwyg.innerHTML=t.length>0?p.a.convertContentsForEditor(t):"

    "+p.a.zeroWidthSpace+"

    ",e.element.wysiwyg.scrollTop=0,e.element.code.style.display="none",e.element.wysiwyg.style.display="block","auto"===e.option.height&&(e.element.code.style.height="0px"),this._variable.wysiwygActive=!0,this.focus()}},toggleFullScreen:function(t){this._variable.isFullScreen?(this._variable.isFullScreen=!1,e.element.code.style.cssText=this._variable._codeOriginCssText,e.element.wysiwyg.style.cssText=this._variable._wysiwygOriginCssText,e.element.toolbar.style.cssText="",e.element.editorArea.style.cssText=this._variable._editorAreaOriginCssText,e.element.topArea.style.cssText=this._variable._originCssText,n.body.style.overflow=this._variable._bodyOverflow,e.option.stickyToolbar>-1&&(p.a.removeClass(e.element.toolbar,"sun-editor-sticky"),a.onScroll_window()),p.a.removeClass(t.firstElementChild,"icon-reduction"),p.a.addClass(t.firstElementChild,"icon-expansion")):(this._variable.isFullScreen=!0,e.element.topArea.style.position="fixed",e.element.topArea.style.top="0",e.element.topArea.style.left="0",e.element.topArea.style.width="100%",e.element.topArea.style.height="100%",e.element.topArea.style.zIndex="2147483647",this._variable._bodyOverflow=n.body.style.overflow,n.body.style.overflow="hidden",this._variable._editorAreaOriginCssText=e.element.editorArea.style.cssText,this._variable._wysiwygOriginCssText=e.element.wysiwyg.style.cssText,this._variable._codeOriginCssText=e.element.code.style.cssText,e.element.editorArea.style.cssText=e.element.toolbar.style.cssText=e.element.wysiwyg.style.cssText=e.element.code.style.cssText="",e.element.toolbar.style.width=e.element.wysiwyg.style.height=e.element.code.style.height="100%",e.element.toolbar.style.position="relative",this._variable.innerHeight_fullScreen=o.innerHeight-e.element.toolbar.offsetHeight,e.element.editorArea.style.height=this._variable.innerHeight_fullScreen+"px",p.a.removeClass(t.firstElementChild,"icon-expansion"),p.a.addClass(t.firstElementChild,"icon-reduction"))},openWindowContents:function(t){const n="print"===t,l=o.open("","_blank");l.mimeType="text/html",l.document.write(''+(n?i.toolbar.print:i.toolbar.preview)+'
    '+this.getContents()+"
    "+(n?"' : '') + '' + '');\n },\n\n /**\r\n * @description Gets the current contents\r\n * @returns {Object}\r\n */\n getContents: function () {\n let contents = '';\n if (context.element.wysiwyg.innerText.trim().length === 0) return contents;\n\n if (editor._variable.wysiwygActive) {\n contents = context.element.wysiwyg.innerHTML;\n } else {\n contents = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(context.element.code.value);\n }\n\n const renderHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n renderHTML.innerHTML = contents;\n const figcaptions = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(renderHTML, function (current) {\n return /FIGCAPTION/i.test(current.nodeName);\n });\n\n for (let i = 0, len = figcaptions.length; i < len; i++) {\n figcaptions[i].outerHTML = figcaptions[i].outerHTML.replace(/(?!^]*>)/i, '');\n }\n\n return renderHTML.innerHTML;\n }\n };\n /**\r\n * @description event function\r\n */\n\n const event = {\n _shortcutKeyCode: {\n 66: ['bold', 'B'],\n 83: ['strikethrough', 'STRIKE'],\n 85: ['underline', 'U'],\n 73: ['italic', 'I'],\n 89: ['redo'],\n 90: ['undo'],\n 219: ['outdent'],\n 221: ['indent']\n },\n _directionKeyKeyCode: new RegExp('^(?:8|13|32|46|33|34|35|36|37|38|39|40|98|100|102|104)$'),\n _changeButtonClassTagCheck: new RegExp('^(?:B|U|I|STRIKE|SUB|SUP)$'),\n _findButtonEffectTag: function () {\n const commandMap = editor.commandMap;\n const classOnCheck = this._changeButtonClassTagCheck;\n const commandMapNodes = [];\n const currentNodes = [];\n let findFormat = true,\n findFont = true,\n findSize = true,\n findA = true;\n let findB = true,\n findI = true,\n findU = true,\n findS = true;\n let cssText = '',\n nodeName = '';\n\n for (let selectionParent = editor.getSelectionNode(); !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionParent); selectionParent = selectionParent.parentNode) {\n if (!selectionParent) break;\n if (selectionParent.nodeType !== 1) continue;\n nodeName = selectionParent.nodeName.toUpperCase();\n currentNodes.push(nodeName);\n /** Format */\n\n if (findFormat && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionParent)) {\n commandMapNodes.push('FORMAT');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FORMAT, nodeName);\n findFormat = false;\n continue;\n }\n /** Font */\n\n\n if (findFont && (selectionParent.style.fontFamily.length > 0 || selectionParent.face && selectionParent.face.length > 0)) {\n commandMapNodes.push('FONT');\n const selectFont = (selectionParent.style.fontFamily || selectionParent.face || lang.toolbar.font).replace(/[\"']/g, '');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FONT, selectFont);\n findFont = false;\n }\n /** A */\n\n\n if (findA && /^A$/.test(nodeName) && selectionParent.getAttribute('data-image-link') === null) {\n if (!context.link || editor.controllerArray[0] !== context.link.linkBtn) {\n editor.callPlugin('link', function () {\n editor.plugins.link.call_controller_linkButton.call(editor, selectionParent);\n });\n }\n\n findA = false;\n } else if (findA && context.link && editor.controllerArray[0] === context.link.linkBtn) {\n editor.controllersOff();\n }\n /** SPAN */\n\n\n if (findSize && /^SPAN$/.test(nodeName)) {\n /** font size */\n if (selectionParent.style.fontSize.length > 0) {\n commandMapNodes.push('SIZE');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.SIZE, selectionParent.style.fontSize.match(/\\d+/)[0]);\n findSize = false;\n }\n }\n /** command map */\n\n\n cssText = selectionParent.style.cssText;\n\n if (findB && /font\\-weight\\s*:\\s*(?:\\d+|bold|bolder)(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('B');\n findB = false;\n }\n\n if (findI && /font\\-style\\s*:\\s*(?:italic|oblique)(?:;|\\s)/.test(cssText)) {\n commandMapNodes.push('I');\n findI = false;\n }\n\n if (findU && /text\\-decoration(?:\\-line)?\\s*:\\s*underline(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('U');\n findU = false;\n }\n\n if (findS && /text\\-decoration(?:\\-line)?\\s*:\\s*line-through(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('STRIKE');\n findS = false;\n }\n\n commandMapNodes.push(/^STRONG$/.test(nodeName) ? 'B' : /^EM$/.test(nodeName) ? 'I' : nodeName);\n }\n /** A Tag edit controller off */\n\n\n if (findA) editor.controllersOff();\n /** toggle class on */\n\n for (let i = 0; i < commandMapNodes.length; i++) {\n nodeName = commandMapNodes[i];\n\n if (classOnCheck.test(nodeName)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(commandMap[nodeName], 'on');\n }\n }\n /** remove class, display text */\n\n\n for (let key in commandMap) {\n if (commandMapNodes.indexOf(key) > -1) continue;\n\n if (/^FONT/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.font);\n } else if (/^SIZE$/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.fontSize);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(commandMap[key], 'on');\n }\n }\n /** save current nodes */\n\n\n editor._variable.currentNodes = currentNodes.reverse();\n /** Displays the current node structure to resizingBar */\n\n if (context.option.showPathLabel) context.element.navigation.textContent = editor._variable.currentNodes.join(' > ');\n },\n _cancelCaptionEdit: function () {\n this.setAttribute('contenteditable', false);\n this.removeEventListener('blur', event._cancelCaptionEdit);\n },\n onMouseDown_toolbar: function (e) {\n editor._editorRange();\n\n e.preventDefault();\n let target = e.target;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(target, '.sun-editor-submenu')) {\n e.stopPropagation();\n } else {\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n className = target.className;\n }\n\n if (command === editor._submenuName) {\n e.stopPropagation();\n }\n }\n },\n onClick_toolbar: function (e) {\n e.preventDefault();\n e.stopPropagation();\n let target = e.target;\n let display = target.getAttribute('data-display');\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n display = target.getAttribute('data-display');\n className = target.className;\n }\n\n if (!command && !display) return;\n if (target.disabled) return;\n /** Dialog, Submenu */\n\n if (display) {\n if (/submenu/.test(display) && (target.nextElementSibling === null || target !== editor.submenuActiveButton)) {\n editor.callPlugin(command, function () {\n editor.submenuOn(target);\n });\n return;\n } else if (/dialog/.test(display)) {\n editor.callPlugin(command, function () {\n editor.plugins.dialog.open.call(editor, command, false);\n });\n return;\n }\n\n editor.submenuOff();\n return;\n }\n /** default command */\n\n\n if (command) {\n editor.focus();\n editor.commandHandler(target, command);\n }\n },\n onMouseUp_wysiwyg: function () {\n editor._editorRange();\n\n if (editor._isBalloon) {\n const range = editor.getRange();\n if (range.collapsed) event._hideToolbar();else event._showToolbarBalloon(range);\n }\n },\n onClick_wysiwyg: function (e) {\n e.stopPropagation();\n const targetElement = e.target;\n\n if (/^IMG$/i.test(targetElement.nodeName)) {\n e.preventDefault();\n editor.callPlugin('image', function () {\n const size = editor.plugins.resizing.call_controller_resize.call(editor, targetElement, 'image');\n editor.plugins.image.onModifyMode.call(editor, targetElement, size);\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, '.sun-editor-id-image-container')) {\n editor.plugins.image.openModify.call(editor, true);\n editor.plugins.image.update_image.call(editor);\n editor.controllersOff();\n }\n });\n return;\n }\n\n if (/sun-editor-id-iframe-inner-resizing-cover/i.test(targetElement.className)) {\n e.preventDefault();\n editor.callPlugin('video', function () {\n const iframe = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getChildElement(targetElement.parentNode, 'iframe');\n const size = editor.plugins.resizing.call_controller_resize.call(editor, iframe, 'video');\n editor.plugins.video.onModifyMode.call(editor, iframe, size);\n });\n return;\n }\n\n event._findButtonEffectTag();\n\n const figcaption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, 'FIGCAPTION');\n\n if (figcaption && figcaption.getAttribute('contenteditable') !== 'ture') {\n e.preventDefault();\n figcaption.setAttribute('contenteditable', true);\n figcaption.focus();\n\n if (editor._isInline && !editor._inlineToolbarAttr.isShow) {\n event._showToolbarInline();\n\n const hideToolbar = function () {\n event._hideToolbar();\n\n _d.removeEventListener('click', hideToolbar);\n };\n\n _d.addEventListener('click', hideToolbar);\n }\n } else {\n const td = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n\n if (td) {\n if (editor.controllerArray.length === 0) {\n editor.callPlugin('table', editor.plugins.table.call_controller_tableEdit.bind(editor, td));\n }\n }\n }\n\n if (userFunction.onClick) userFunction.onClick(e);\n },\n _showToolbarBalloon: function (rangeObj) {\n const range = rangeObj || editor.getRange();\n const padding = 20;\n const toolbar = context.element.toolbar;\n\n const selection = _w.getSelection();\n\n let isDirTop;\n\n if (selection.focusNode === selection.anchorNode) {\n isDirTop = selection.focusOffset < selection.anchorOffset;\n } else {\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(range.commonAncestorContainer);\n isDirTop = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.focusNode) < _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.anchorNode);\n }\n\n let rects = range.getClientRects();\n rects = rects[isDirTop ? 0 : rects.length - 1];\n toolbar.style.display = 'block';\n const toolbarWidth = toolbar.offsetWidth;\n const toolbarHeight = toolbar.offsetHeight;\n let l = (isDirTop ? rects.left : rects.right) - context.element.topArea.offsetLeft + (_w.scrollX || _d.documentElement.scrollLeft) - toolbarWidth / 2;\n let t = (isDirTop ? rects.top - toolbarHeight - 11 : rects.bottom + 11) - context.element.topArea.offsetTop + (_w.scrollY || _d.documentElement.scrollTop);\n const overRight = l + toolbarWidth - context.element.topArea.offsetWidth;\n toolbar.style.left = (l < 0 ? padding : overRight < 0 ? l : l - overRight - padding) + 'px';\n toolbar.style.top = t + 'px';\n\n if (isDirTop) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-up');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-down');\n context.element._arrow.style.top = toolbarHeight + 'px';\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-down');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-up');\n context.element._arrow.style.top = '-11px';\n }\n\n const arrow_width = context.element._arrow.offsetWidth;\n const arrow_left = toolbarWidth / 2 + (l < 0 ? l - arrow_width : overRight < 0 ? 0 : overRight + arrow_width);\n const arrow_point_width = arrow_width / 2;\n context.element._arrow.style.left = (arrow_left < arrow_point_width ? arrow_point_width : arrow_left + arrow_point_width >= toolbarWidth ? arrow_left - arrow_point_width : arrow_left) + 'px';\n },\n _showToolbarInline: function () {\n const toolbar = context.element.toolbar;\n toolbar.style.display = 'block';\n editor._inlineToolbarAttr.width = toolbar.style.width = context.option.toolbarWidth;\n editor._inlineToolbarAttr.top = toolbar.style.top = -1 - toolbar.offsetHeight + 'px';\n event.onScroll_window();\n editor._inlineToolbarAttr.isShow = true;\n },\n _hideToolbar: function () {\n context.element.toolbar.style.display = 'none';\n editor._inlineToolbarAttr.isShow = false;\n },\n onKeyDown_wysiwyg: function (e) {\n const keyCode = e.keyCode;\n const shift = e.shiftKey;\n const ctrl = e.ctrlKey || e.metaKey;\n const alt = e.altKey;\n\n if (editor._isBalloon) {\n event._hideToolbar();\n }\n\n function shortcutCommand(keyCode) {\n const key = event._shortcutKeyCode[keyCode];\n if (!key) return false;\n editor.commandHandler(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(editor.getSelectionNode()), key[0]);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(editor.commandMap[key[1]], 'on');\n return true;\n }\n /** Shortcuts */\n\n\n if (ctrl && !/^(?:16|17|18)$/.test(keyCode)) {\n if (!(!shift && keyCode === 83) && shortcutCommand(keyCode)) {\n e.preventDefault();\n return;\n }\n }\n /** default key action */\n\n\n const selectionNode = editor.getSelectionNode();\n\n switch (keyCode) {\n case 8:\n /**backspace key*/\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionNode) && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentNode) && selectionNode.previousSibling === null) {\n e.preventDefault();\n e.stopPropagation();\n selectionNode.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n return false;\n }\n\n break;\n\n case 9:\n /**tab key*/\n e.preventDefault();\n if (ctrl || alt) break;\n editor.controllersOff();\n let currentNode = selectionNode || editor.getSelectionNode();\n\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(currentNode)) {\n currentNode = currentNode.parentNode;\n }\n\n if (currentNode && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode)) {\n const table = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(currentNode, 'table');\n const cells = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(table, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n let idx = shift ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prevIdx(cells, currentNode) : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].nextIdx(cells, currentNode);\n if (idx === cells.length && !shift) idx = 0;\n if (idx === -1 && shift) idx = cells.length - 1;\n const moveCell = cells[idx];\n if (!moveCell) return false;\n editor.setRange(moveCell, 0, moveCell, 0);\n break;\n }\n /** format Tag */\n\n\n const lines = editor.getSelectedFormatElements();\n\n if (!shift) {\n const tabText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(new Array(editor._variable.tabSize + 1).join('\\u00A0'));\n\n if (lines.length === 1) {\n editor.insertNode(tabText);\n editor.setRange(tabText, editor._variable.tabSize, tabText, editor._variable.tabSize);\n } else {\n for (let i = 0, len = lines.length; i < len; i++) {\n lines[i].insertBefore(tabText.cloneNode(false), lines[i].firstChild);\n }\n }\n } else {\n for (let i = 0, len = lines.length, child; i < len; i++) {\n child = lines[i].firstChild;\n\n if (/^\\s{1,4}$/.test(child.textContent)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(child);\n } else if (/^\\s{1,4}/.test(child.textContent)) {\n child.textContent = child.textContent.replace(/^\\s{1,4}/, '');\n }\n }\n }\n\n break;\n }\n\n if (userFunction.onKeyDown) userFunction.onKeyDown(e);\n },\n onKeyUp_wysiwyg: function (e) {\n editor._editorRange();\n\n editor.controllersOff();\n const selectionNode = editor.getSelectionNode();\n\n if (editor._isBalloon && !editor.getRange().collapsed) {\n event._showToolbarBalloon();\n\n return;\n }\n /** when format tag deleted */\n\n\n if (e.keyCode === 8 && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode) && context.element.wysiwyg.textContent.length === 0) {\n e.preventDefault();\n e.stopPropagation();\n const oFormatTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(editor._variable.currentNodes[0]) ? editor._variable.currentNodes[0] : 'P');\n oFormatTag.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n selectionNode.appendChild(oFormatTag);\n editor.setRange(oFormatTag, 0, oFormatTag, 0);\n return;\n }\n\n if ((_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(selectionNode.parentElement)) && selectionNode.nodeType === 3) {\n editor.execCommand('formatBlock', false, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) ? 'P' : 'DIV');\n\n event._findButtonEffectTag();\n\n return;\n }\n\n if (event._directionKeyKeyCode.test(e.keyCode)) {\n event._findButtonEffectTag();\n }\n\n if (userFunction.onKeyUp) userFunction.onKeyUp(e);\n },\n onScroll_wysiwyg: function (e) {\n editor.controllersOff();\n if (userFunction.onScroll) userFunction.onScroll(e);\n },\n onDrop_wysiwyg: function (e) {\n const files = e.dataTransfer.files;\n\n if (files.length > 0) {\n e.stopPropagation();\n e.preventDefault();\n editor.focus();\n editor.callPlugin('image', function () {\n context.image.imgInputFile.files = files;\n editor.plugins.image.onRender_imgInput.call(editor);\n context.image.imgInputFile.files = null;\n });\n }\n\n if (userFunction.onDrop) userFunction.onDrop(e);\n },\n onMouseDown_resizingBar: function (e) {\n e.stopPropagation();\n editor._variable.resizeClientY = e.clientY;\n context.element.resizeBackground.style.display = 'block';\n\n function closureFunc() {\n context.element.resizeBackground.style.display = 'none';\n\n _d.removeEventListener('mousemove', event._resize_editor);\n\n _d.removeEventListener('mouseup', closureFunc);\n }\n\n _d.addEventListener('mousemove', event._resize_editor);\n\n _d.addEventListener('mouseup', closureFunc);\n },\n _resize_editor: function (e) {\n const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - editor._variable.resizeClientY);\n context.element.wysiwyg.style.height = context.element.code.style.height = (resizeInterval < editor._variable.minResizingSize ? editor._variable.minResizingSize : resizeInterval) + 'px';\n editor._variable.resizeClientY = e.clientY;\n },\n onResize_window: function () {\n if (context.element.toolbar.offsetWidth === 0) return;\n\n if (editor._variable.isFullScreen) {\n editor._variable.innerHeight_fullScreen += _w.innerHeight - context.element.toolbar.offsetHeight - editor._variable.innerHeight_fullScreen;\n context.element.editorArea.style.height = editor._variable.innerHeight_fullScreen + 'px';\n } else if (editor._variable._sticky) {\n context.element.toolbar.style.width = context.element.topArea.offsetWidth - 2 + 'px';\n event.onScroll_window();\n }\n\n editor.controllersOff();\n },\n onScroll_window: function () {\n if (editor._variable.isFullScreen || context.element.toolbar.offsetWidth === 0) return;\n const element = context.element;\n const editorHeight = element.editorArea.offsetHeight;\n const editorTop = element.topArea.offsetTop - (editor._isInline ? element.toolbar.offsetHeight : 0);\n const y = (this.scrollY || _d.documentElement.scrollTop) + context.option.stickyToolbar;\n\n if (y < editorTop) {\n event._offStickyToolbar(element);\n } else if (y + editor._variable.minResizingSize >= editorHeight + editorTop) {\n if (!editor._variable._sticky) event._onStickyToolbar(element);\n element.toolbar.style.top = editorHeight + editorTop + context.option.stickyToolbar - y - editor._variable.minResizingSize + 'px';\n } else if (y >= editorTop) {\n event._onStickyToolbar(element);\n }\n },\n _onStickyToolbar: function (element) {\n if (!editor._isInline) {\n element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px';\n element._stickyDummy.style.display = 'block';\n }\n\n element.toolbar.style.top = context.option.stickyToolbar + 'px';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = true;\n },\n _offStickyToolbar: function (element) {\n element._stickyDummy.style.display = 'none';\n element.toolbar.style.top = editor._isInline ? editor._inlineToolbarAttr.top : '';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : '';\n element.editorArea.style.marginTop = '';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = false;\n },\n _codeViewAutoScroll: function () {\n context.element.code.style.height = context.element.code.scrollHeight + 'px';\n },\n onPaste_wysiwyg: function (e) {\n if (!e.clipboardData.getData) return true;\n const cleanData = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cleanHTML(e.clipboardData.getData('text/html'));\n\n if (cleanData) {\n editor.execCommand('insertHTML', false, cleanData);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n };\n /** add event listeners */\n\n /** toolbar event */\n\n context.element.toolbar.addEventListener('mousedown', event.onMouseDown_toolbar, false);\n context.element.toolbar.addEventListener('click', event.onClick_toolbar, false);\n /** editor area */\n\n context.element.relative.addEventListener('click', editor.focus.bind(editor), false);\n context.element.wysiwyg.addEventListener('mouseup', event.onMouseUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('click', event.onClick_wysiwyg, false);\n context.element.wysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false);\n context.element.wysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false);\n /** code view area auto line */\n\n if (context.option.height === 'auto') context.element.code.addEventListener('keyup', event._codeViewAutoScroll, false);\n /** resizingBar */\n\n if (context.element.resizingBar) {\n if (/\\d+/.test(context.option.height)) {\n context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element.resizingBar, 'none-resize');\n }\n }\n /** inline editor */\n\n\n if (editor._isInline) {\n context.element.wysiwyg.addEventListener('focus', event._showToolbarInline, false);\n }\n\n if (editor._isInline || editor._isBalloon) {\n context.element.wysiwyg.addEventListener('blur', event._hideToolbar, false);\n }\n /** window event */\n\n\n _w.addEventListener('resize', event.onResize_window, false);\n\n if (context.option.stickyToolbar > -1) _w.addEventListener('scroll', event.onScroll_window, false);\n /** add plugin to plugins object */\n\n if (plugins) {\n Object.keys(plugins).map(function (key) {\n let plugin = plugins[key];\n editor.plugins[plugin.name] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(plugin);\n });\n }\n /** User function */\n\n\n const userFunction = {\n /**\r\n * @description Event functions\r\n * @param {Object} event - Event Object\r\n */\n onScroll: null,\n onClick: null,\n onKeyDown: null,\n onKeyUp: null,\n onDrop: null,\n\n /**\r\n * @description Called when the image is uploaded or the uploaded image is deleted\r\n * @param {Element} targetImgElement - Current img element\r\n * @param {Number} index - Uploaded index\r\n * @param {Boolean} isDelete - Whether or not it was called after the delete operation\r\n */\n onImageUpload: null,\n\n /**\r\n * @description Open a notice area\r\n * @param {String} message - Notice message\r\n */\n noticeOpen: function (message) {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].open.call(editor, message);\n },\n\n /**\r\n * @description Close a notice area\r\n */\n noticeClose: function () {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close.call(editor);\n },\n\n /**\r\n * @description Copying the contents of the editor to the original textarea\r\n */\n save: function () {\n context.element.originElement.value = editor.getContents();\n },\n\n /**\r\n * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects\r\n * @returns {Object}\r\n */\n getContext: function () {\n return context;\n },\n\n /**\r\n * @description Gets the contents of the suneditor\r\n * @returns {String}\r\n */\n getContents: function () {\n return editor.getContents();\n },\n\n /**\r\n * @description Gets uploaded images informations\r\n * @returns {Array}\r\n */\n getImagesInfo: function () {\n return editor._variable._imagesInfo;\n },\n\n /**\r\n * @description Inserts an HTML element or HTML string or plain string at the current cursor position\r\n * @param {Element|String} html - HTML Element or HTML string or plain string\r\n */\n insertHTML: function (html) {\n if (!html.nodeType || html.nodeType !== 1) {\n const template = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('template');\n template.innerHTML = html;\n html = template.firstChild || template.content.firstChild;\n }\n\n editor.insertNode(html);\n editor.focus();\n },\n\n /**\r\n * @description Change the contents of the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n setContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value = contents;\n }\n },\n\n /**\r\n * @description Add contents to the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n appendContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML += _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value += contents;\n }\n },\n\n /**\r\n * @description Disable the suneditor\r\n */\n disabled: function () {\n context.tool.cover.style.display = 'block';\n context.element.wysiwyg.setAttribute('contenteditable', false);\n context.element.code.setAttribute('disabled', 'disabled');\n },\n\n /**\r\n * @description Enabled the suneditor\r\n */\n enabled: function () {\n context.tool.cover.style.display = 'none';\n context.element.wysiwyg.setAttribute('contenteditable', true);\n context.element.code.removeAttribute('disabled');\n },\n\n /**\r\n * @description Show the suneditor\r\n */\n show: function () {\n const topAreaStyle = context.element.topArea.style;\n if (topAreaStyle.display === 'none') topAreaStyle.display = context.option.display;\n },\n\n /**\r\n * @description Hide the suneditor\r\n */\n hide: function () {\n context.element.topArea.style.display = 'none';\n },\n\n /**\r\n * @description Destroy the suneditor\r\n */\n destroy: function () {\n /** remove window event listeners */\n _w.removeEventListener('resize', event.onResize_window);\n\n _w.removeEventListener('scroll', event.onScroll_window);\n /** remove element */\n\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(context.element.topArea);\n this.onScroll = null;\n this.onClick = null;\n this.onKeyDown = null;\n this.onKeyUp = null;\n this.onDrop = null;\n this.save = null;\n this.onImageUpload = null;\n this.noticeOpen = null;\n this.noticeClose = null;\n this.getContext = null;\n this.getContents = null;\n this.getImagesInfo = null;\n this.insertHTML = null;\n this.setContents = null;\n this.appendContents = null;\n this.disabled = null;\n this.enabled = null;\n this.show = null;\n this.hide = null;\n this.destroy = null;\n context = null;\n plugins = null;\n lang = null;\n }\n };\n return userFunction;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (core);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbGliL2NvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvcmUuanM/OGE4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IG5vdGljZSBmcm9tICcuLi9wbHVnaW5zL21vZHVsZXMvbm90aWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gU3VuRWRpdG9yIGNvcmUgY2xvc3VyZVxyXG4gKiBAcGFyYW0gY29udGV4dFxyXG4gKiBAcGFyYW0gcGx1Z2luc1xyXG4gKiBAcGFyYW0gbGFuZ1xyXG4gKiBAcmV0dXJucyB7e3NhdmU6IHNhdmUsIGdldENvbnRleHQ6IGdldENvbnRleHQsIGdldENvbnRlbnQ6IGdldENvbnRlbnQsIHNldENvbnRlbnQ6IHNldENvbnRlbnQsIGFwcGVuZENvbnRlbnQ6IGFwcGVuZENvbnRlbnQsIGRpc2FibGVkOiBkaXNhYmxlZCwgZW5hYmxlZDogZW5hYmxlZCwgc2hvdzogc2hvdywgaGlkZTogaGlkZSwgZGVzdHJveTogZGVzdHJveX19XHJcbiAqL1xyXG5jb25zdCBjb3JlID0gZnVuY3Rpb24gKGNvbnRleHQsIHBsdWdpbnMsIGxhbmcpIHtcclxuICAgIGNvbnN0IF9kID0gZG9jdW1lbnQ7XHJcbiAgICBjb25zdCBfdyA9IHdpbmRvdztcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGVkaXRvciBjb3JlIG9iamVjdFxyXG4gICAgICogc2hvdWxkIGFsd2F5cyBiaW5kIHRoaXMgb2JqZWN0IHdoZW4gcmVnaXN0ZXJpbmcgYW4gZXZlbnQgaW4gdGhlIHBsdWctaW4uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVkaXRvciA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgYW5kIHVzZXIgb3B0aW9ucyBwYXJhbWV0ZXJzIG9mIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gbG9hZGVkIHBsdWdpbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBwbHVnaW5zOiB7fSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluaXRQbHVnaW5zOiB7fSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGxvYWRlZCBsYW5ndWFnZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxhbmc6IGxhbmcsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBkaWFsb2cgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRpYWxvZ0Zvcm06IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBjdXJyZW50IHN1Ym1lbnQgbmFtZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3N1Ym1lbnVOYW1lOiAnJyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHN1Ym1lbnUgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnU6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBiaW5kZWQgc3VibWVudU9mZiBtZXRob2RcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9iaW5kZWRTdWJtZW51T2ZmOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYWN0aXZlIGJ1dHRvbiBlbGVtZW50IGluIHN1Ym1lbnVcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51QWN0aXZlQnV0dG9uOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIGVsZW1lbnRzIGFycmF5IHRvIGJlIHByb2Nlc3NlZCB1bnZpc2libGUgd2hlbiB0aGUgY29udHJvbGxlcnNPZmYgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgKHJlc2l6aW5nLCBsaW5rIG1vZGlmaWVkIGJ1dHRvbiwgdGFibGUgY29udHJvbGxlcilcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250cm9sbGVyQXJyYXk6IFtdLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYmluZGVkIGNvbnRyb2xsZXJzT2ZmIG1ldGhvZFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2JpbmRDb250cm9sbGVyc09mZjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIGFycmF5IG9mIGJ1dHRvbnMgd2hvc2UgY2xhc3MgbmFtZSBpcyBub3QgXCJjb2RlLXZpZXctZW5hYmxlZFwiXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29kZVZpZXdEaXNhYmxlZEJ1dHRvbnM6IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdW4tZWRpdG9yLWlkLXRvb2xiYXIgYnV0dG9uOm5vdChbY2xhc3N+PVwiY29kZS12aWV3LWVuYWJsZWRcIl0pJyksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJcyBpbmxpbmUgbW9kZT9cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pc0lubGluZTogL2lubGluZS9pLnRlc3QoY29udGV4dC5vcHRpb24ubW9kZSksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJcyBiYWxsb29uIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNCYWxsb29uOiAvYmFsbG9vbi9pLnRlc3QoY29udGV4dC5vcHRpb24ubW9kZSksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXF1aXJlZCB2YWx1ZSB3aGVuIHVzaW5nIGlubGluZSBtb2RlIHRvIHN0aWNreSB0b29sYmFyXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaW5saW5lVG9vbGJhckF0dHI6IHt3aWR0aDogMCwgaGVpZ2h0OiAwLCBpc1Nob3c6IGZhbHNlfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIHVzZXIgZXZlbnQgZnVuY3Rpb24gd2hlbiBpbWFnZSB1cGxvYWRlZCBzdWNjZXNzIG9yIHJlbW92ZSBpbWFnZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2ltYWdlVXBsb2FkOiBmdW5jdGlvbiAodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXgsIGlzRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25JbWFnZVVwbG9hZCkgdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWQodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXgsIGlzRGVsZXRlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZSB0ZXh0IG9yIGNsYXNzTmFtZSBmb3IgZWFjaCBzZWxlY3Rpb24gY2hhbmdlXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT1JNQVQgLSBmb3JtYXQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT05UIC0gZm9udCBmYW1pbHkgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBTSVpFIC0gZm9udCBzaXplIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gQiAtIGJvbGQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBVIC0gdW5kZXJsaW5lIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gSSAtIGl0YWxpYyBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNUUklLRSAtIHN0cmlrZSBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVQiAtIHN1YnNjcmlwdCBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVUCAtIHN1cGVyc2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbW1hbmRNYXA6IHtcclxuICAgICAgICAgICAgRk9STUFUOiBjb250ZXh0LnRvb2wuZm9ybWF0LFxyXG4gICAgICAgICAgICBGT05UOiBjb250ZXh0LnRvb2wuZm9udCxcclxuICAgICAgICAgICAgU0laRTogY29udGV4dC50b29sLmZvbnRTaXplLFxyXG4gICAgICAgICAgICBCOiBjb250ZXh0LnRvb2wuYm9sZCxcclxuICAgICAgICAgICAgVTogY29udGV4dC50b29sLnVuZGVybGluZSxcclxuICAgICAgICAgICAgSTogY29udGV4dC50b29sLml0YWxpYyxcclxuICAgICAgICAgICAgU1RSSUtFOiBjb250ZXh0LnRvb2wuc3RyaWtlLFxyXG4gICAgICAgICAgICBTVUI6IGNvbnRleHQudG9vbC5zdWJzY3JpcHQsXHJcbiAgICAgICAgICAgIFNVUDogY29udGV4dC50b29sLnN1cGVyc2NyaXB0XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFZhcmlhYmxlcyB1c2VkIGludGVybmFsbHkgaW4gZWRpdG9yIG9wZXJhdGlvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gd3lzaXd5Z0FjdGl2ZSAtIFRoZSB3eXNpd3lnIGZyYW1lIG9yIGNvZGUgdmlldyBzdGF0ZVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNGdWxsU2NyZWVuIC0gU3RhdGUgb2YgZnVsbCBzY3JlZW5cclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiAtIElubmVySGVpZ2h0IGluIGVkaXRvciB3aGVuIGluIGZ1bGwgc2NyZWVuXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlc2l6ZUNsaWVudFkgLSBSZW1lbWJlciB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZWRpdG9yIGJlZm9yZSByZXNpemluZyB0aGUgZWRpdG9yIChVc2VkIHdoZW4gY2FsY3VsYXRpbmcgZHVyaW5nIHJlc2l6ZSBvcGVyYXRpb24pXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRhYlNpemUgLSBJbmRlbnRlZCBzaXplIHdoZW4gdGFiIGJ1dHRvbiBjbGlja2VkICg0KVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5SZXNpemluZ1NpemUgLSBNaW5pbXVtIHNpemUgb2YgZWRpdGluZyBhcmVhIHdoZW4gcmVzaXplZCAoNjUpXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtBcnJheX0gY3VycmVudE5vZGVzIC0gIEFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGN1cnNvcidzIG5vZGUgc3RydWN0dXJlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfdmFyaWFibGU6IHtcclxuICAgICAgICAgICAgd3lzaXd5Z0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjogMCxcclxuICAgICAgICAgICAgcmVzaXplQ2xpZW50WTogMCxcclxuICAgICAgICAgICAgdGFiU2l6ZTogNCxcclxuICAgICAgICAgICAgbWluUmVzaXppbmdTaXplOiA2NSxcclxuICAgICAgICAgICAgY3VycmVudE5vZGVzOiBbXSxcclxuICAgICAgICAgICAgX3JhbmdlOiBudWxsLFxyXG4gICAgICAgICAgICBfc2VsZWN0aW9uTm9kZTogbnVsbCxcclxuICAgICAgICAgICAgX29yaWdpbkNzc1RleHQ6IGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQsXHJcbiAgICAgICAgICAgIF9ib2R5T3ZlcmZsb3c6ICcnLFxyXG4gICAgICAgICAgICBfZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfd3lzaXd5Z09yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfY29kZU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfc3RpY2t5OiBmYWxzZSxcclxuICAgICAgICAgICAgX2ltYWdlc0luZm86IFtdLFxyXG4gICAgICAgICAgICBfaW1hZ2VJbmRleDogMFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJZiB0aGUgcGx1Z2luIGlzIG5vdCBhZGRlZCwgYWRkIHRoZSBwbHVnaW4gYW5kIGNhbGwgdGhlICdhZGQnIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIElmIHRoZSBwbHVnaW4gaXMgYWRkZWQgY2FsbCBjYWxsQmFjayBmdW5jdGlvbi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGx1Z2luTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdG8gY2FsbFxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxCYWNrRnVuY3Rpb24gLSBGdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBtb2R1bGUgY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBjYWxsQmFja0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jb3JlLmNhbGxQbHVnaW4uZmFpbF0gVGhlIGNhbGxlZCBwbHVnaW4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXQuIChwbHVnaW5OYW1lOlwiJyArIHBsdWdpbk5hbWUgKyAnXCIpJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5pdFBsdWdpbnNbcGx1Z2luTmFtZV0pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdLmFkZCh0aGlzLCB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uYnV0dG9uRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQbHVnaW5zW3BsdWdpbk5hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNhbGxCYWNrRnVuY3Rpb24oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSWYgdGhlIG1vZHVsZSBpcyBub3QgYWRkZWQsIGFkZCB0aGUgbW9kdWxlIGFuZCBjYWxsIHRoZSAnYWRkJyBmdW5jdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZHVsZUFycmF5IC0gbW9kdWxlIG9iamVjdCdzIEFycmF5IFtkaWFsb2csIHJlc2l6aW5nXVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFkZE1vZHVsZTogZnVuY3Rpb24gKG1vZHVsZUFycmF5KSB7XHJcbiAgICAgICAgICAgIGxldCBtb2R1bGVOYW1lID0gJyc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtb2R1bGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IG1vZHVsZUFycmF5W2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSA9IHV0aWwuY29weU9iaihtb2R1bGVBcnJheVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdLmFkZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbmFibGVkIHN1Ym1lbnVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBTdWJtZW51IGVsZW1lbnQgdG8gY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPbjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3VibWVudU5hbWUgPSB0aGlzLl9zdWJtZW51TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24pIHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24uY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudSA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudCwgJ29uJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvdmVyTGVmdCA9IHRoaXMuY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggLSAoZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLnN1Ym1lbnUub2Zmc2V0V2lkdGgpO1xyXG4gICAgICAgICAgICBpZiAob3ZlckxlZnQgPCAwKSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9IG92ZXJMZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9ICcxcHgnO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYmluZGVkU3VibWVudU9mZiA9IHRoaXMuc3VibWVudU9mZi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgc3VibWVudVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPZmY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VibWVudU5hbWUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtZW51ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3ModGhpcy5zdWJtZW51QWN0aXZlQnV0dG9uLCAnb24nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5W2ldID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYgPSB0aGlzLmNvbnRyb2xsZXJzT2ZmLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiwgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT2ZmOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHRoaXMuY29udHJvbGxlckFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgLSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBzaG93RGVmYXVsdFVJIC0gamF2YXNjcmlwdCBleGVjQ29tbWFuZCBmdW5jdGlvbiBwcm9wZXJ0eVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIGphdmFzY3JpcHQgZXhlY0NvbW1hbmQgZnVuY3Rpb24gcHJvcGVydHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGVjQ29tbWFuZDogZnVuY3Rpb24gKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIF9kLmV4ZWNDb21tYW5kKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIChjb21tYW5kID09PSAnZm9ybWF0QmxvY2snID8gJzwnICsgdmFsdWUgKyAnPicgOiB2YWx1ZSkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBGb2N1cyB0byB3eXNpd3lnIGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCAnZmlnY2FwdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvbi5mb2N1cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQuX2ZpbmRCdXR0b25FZmZlY3RUYWcoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgZWRpdG9yJ3MgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZW5kT2ZmIC0gVGhlIGVuZE9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRSYW5nZTogZnVuY3Rpb24gKHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBfZC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydENvbiwgc3RhcnRPZmYpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoZW5kQ29uLCBlbmRPZmYpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gX3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBlZGl0b3IncyByYW5nZSBvYmplY3RcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZS5fcmFuZ2UgfHwgdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IHNlbGVjdCBub2RlXHJcbiAgICAgICAgICogQHJldHVybnMge05vZGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0aW9uTm9kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUgfHwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2F2aW5nIHRoZSByYW5nZSBvYmplY3QgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvZiBlZGl0b3JcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9lZGl0b3JSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKCF1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0aW9uLmZvY3VzTm9kZSwgJy5zdW4tZWRpdG9yLWlkLXd5c2l3eWcnKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IHJhbmdlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbi5leHRlbnROb2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbk5vZGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybiB0aGUgcmFuZ2Ugb2JqZWN0IG9mIGVkaXRvcidzIGZpcnN0IGNoaWxkIG5vZGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2NyZWF0ZURlZmF1bHRSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IF9kLmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmZpcnN0Q2hpbGQsIDApO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZCwgMCk7XHJcbiAgICAgICAgICAgIHJldHVybiByYW5nZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIFwiZm9ybWF0RWxlbWVudFwiKFAsIERJViwgSFsxLTZdLCBMSSkgYXJyYXkgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGNoaWxkcmVuWzBdLCAwLCBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUZvcm1hdEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikgJiYgIXV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFt1dGlsLmdldEZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKV07XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0Q29uID09PSBlbmRDb24pIHJldHVybiBsaW5lTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHN0YXJ0Q29uKTtcclxuICAgICAgICAgICAgbGV0IGVuZExpbmUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoZW5kQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SWR4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGVuZElkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGluZU5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRMaW5lID09PSBsaW5lTm9kZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gbGluZU5vZGVzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpIDw9IGVuZElkeDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdEVsZW1lbnRzLnB1c2gobGluZU5vZGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBcInJhbmdlRm9ybWF0RWxlbWVudFwiKGJsb2NrcXVvdGUsIFRBQkxFLCBUUiwgVEQsIE9MLCBVTCwgUFJFKSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFNlbGVjdGVkUmFuZ2VGb3JtYXRFbGVtZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1d5c2l3eWdEaXYocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShjaGlsZHJlblswXSwgMCwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0sIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnRleHRDb250ZW50Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VGb3JtYXRFbGVtZW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFtjb21tb25Db25dO1xyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbCA/IFtlbF0gOiBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IHJhbmdlIEVsZW1lbnRzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWxlbWVudHMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhcnRDb24gPT09IGVuZENvbikgcmV0dXJuIHJhbmdlRWxlbWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kTGluZSA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVuZENvbik7XHJcbiAgICAgICAgICAgIGxldCBzdGFydElkeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBlbmRJZHggPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydExpbmUgPT09IHJhbmdlRWxlbWVudHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gcmFuZ2VFbGVtZW50c1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA8PSBlbmRJZHg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRWxlbWVudHNbaV0pIHJhbmdlRm9ybWF0RWxlbWVudHMucHVzaChyYW5nZUVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERldGVybWluZSBpZiB0aGlzIG9mZnNldCBpcyB0aGUgZWRnZSBvZmZzZXQgb2YgY29udGFpbmVyXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIFRoZSBvZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaXNFZGdlUG9pbnQ6IGZ1bmN0aW9uIChjb250YWluZXIsIG9mZnNldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKG9mZnNldCA9PT0gMCkgfHwgKG9mZnNldCA9PT0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0xvYWRpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFwcGVuZCBmb3JtYXQgZWxlbWVudCB0byBzaWJsaW5nIG5vZGUgb2YgYXJndW1lbnQgZWxlbWVudC5cclxuICAgICAgICAgKiBJZiB0aGUgXCJmb3JtYXROb2RlTmFtZVwiIGFyZ3VtZW50IHZhbHVlIGlzIHByZXNlbnQsIHRoZSB0YWcgb2YgdGhhdCBhcmd1bWVudCB2YWx1ZSBpcyBpbnNlcnRlZCxcclxuICAgICAgICAgKiBJZiBub3QsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IHRhZyBpcyBpbnNlcnRlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBJbnNlcnQgYXMgc2libGluZ3Mgb2YgdGhhdCBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8bnVsbH0gZm9ybWF0Tm9kZU5hbWUgLSBOb2RlIG5hbWUgdG8gYmUgaW5zZXJ0ZWRcclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRGb3JtYXRUYWc6IGZ1bmN0aW9uIChlbGVtZW50LCBmb3JtYXROb2RlTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRFbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVsZW1lbnQpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKTtcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdE5hbWUgPSBmb3JtYXROb2RlTmFtZSA/IGZvcm1hdE5vZGVOYW1lIDogdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudEZvcm1hdEVsKSA/IGN1cnJlbnRGb3JtYXRFbC5ub2RlTmFtZSA6ICdQJztcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChvRm9ybWF0TmFtZSk7XHJcbiAgICAgICAgICAgIG9Gb3JtYXQuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQ2VsbChmb3JtYXRFbCkpIGZvcm1hdEVsLmluc2VydEJlZm9yZShvRm9ybWF0LCBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgIGVsc2UgZm9ybWF0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob0Zvcm1hdCwgZm9ybWF0RWwubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvRm9ybWF0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgc2VsZWN0ZWQgbm9kZSBhbmQgaW5zZXJ0IGFyZ3VtZW50IHZhbHVlIG5vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9Ob2RlIC0gTm9kZSB0byBiZSBpbnNlcnRlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8bnVsbCl9IHJpZ2h0Tm9kZSAtIElmIHRoZSBub2RlIGV4aXN0cywgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnROb2RlOiBmdW5jdGlvbiAob05vZGUsIHJpZ2h0Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyaWdodE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kT2ZmID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIE5vIFNlbGVjdCByYW5nZSBub2RlICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1vbkNvbi5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodE5vZGUgPSBjb21tb25Db24uc3BsaXRUZXh0KGVuZE9mZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5sYXN0Q2hpbGQgIT09IG51bGwgJiYgdXRpbC5pc0JyZWFrKHBhcmVudE5vZGUubGFzdENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYXJlbnROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiogU2VsZWN0IHJhbmdlIG5vZGVzICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVDb250YWluZXIgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWRnZVBvaW50KGVuZENvbiwgZW5kT2ZmKSkgcmlnaHROb2RlID0gZW5kQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJpZ2h0Tm9kZSA9IGVuZENvbi5zcGxpdFRleHQoZW5kT2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VkZ2VQb2ludChzdGFydENvbiwgc3RhcnRPZmYpKSByZW1vdmVOb2RlID0gc3RhcnRDb24uc3BsaXRUZXh0KHN0YXJ0T2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IGNvbW1vbkNvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJpZ2h0Tm9kZS5wYXJlbnROb2RlICE9PSBjb21tb25Db24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgcmlnaHROb2RlID0gcmlnaHROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob05vZGUsIHJpZ2h0Tm9kZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQob05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW1vdmVOb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmRlbGV0ZUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBsZXQgYmVmb3JlTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBhZnRlck5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHV0aWwuZ2V0TGlzdENoaWxkTm9kZXMoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2Rlcywgc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2RlcywgZW5kQ29uKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4ICsgMSwgc3RhcnROb2RlID0gc3RhcnRDb247IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXSA9PT0gc3RhcnROb2RlLnBhcmVudE5vZGUgJiYgY2hpbGROb2Rlc1tpXS5maXJzdENoaWxkID09PSBzdGFydE5vZGUgJiYgc3RhcnRPZmYgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZEluZGV4IC0gMSwgZW5kTm9kZSA9IGVuZENvbjsgaSA+IHN0YXJ0SW5kZXg7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0gPT09IGVuZE5vZGUucGFyZW50Tm9kZSAmJiBjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2Rlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAtLWVuZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGROb2Rlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDAgfHwgKGl0ZW0ubm9kZVR5cGUgPT09IDMgJiYgaXRlbS5kYXRhID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBzdGFydENvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoc3RhcnRDb24uc3Vic3RyaW5nRGF0YSgwLCBzdGFydE9mZikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZU5vZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbi5kYXRhID0gYmVmb3JlTm9kZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShlbmRDb24uc3Vic3RyaW5nRGF0YShlbmRPZmYsIChlbmRDb24ubGVuZ3RoIC0gZW5kT2ZmKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyTm9kZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbi5kYXRhID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVuZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYXBwZW5kZWQgYWxsIHNlbGVjdGVkIGZvcm1hdCBFbGVtZW50IHRvIHRoZSBhcmd1bWVudCBlbGVtZW50IGFuZCBpbnNlcnRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBUYWcgLSBFbGVtZW50IG9mIHdyYXAgdGhlIGFyZ3VtZW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHdyYXBUb1RhZ3M6IGZ1bmN0aW9uICh3cmFwVGFnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUxpbmVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJhbmdlTGluZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gdXRpbC5jcmVhdGVFbGVtZW50KHV0aWwuaXNDZWxsKHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKSA/ICdESVYnIDogJ1AnKTtcclxuICAgICAgICAgICAgICAgIGlubmVyLmlubmVySFRNTCA9IHV0aWwuemVyb1dpZHRoU3BhY2U7XHJcbiAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGlubmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLmFwcGVuZENoaWxkKHdyYXBUYWcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFzdCAgPSByYW5nZUxpbmVzW3JhbmdlTGluZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGxldCBzdGFuZFRhZywgYmVmb3JlVGFnLCBwRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuaXNGb3JtYXRFbGVtZW50KGxhc3QpKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IGxhc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChsYXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNDZWxsKHN0YW5kVGFnKSkge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlVGFnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVUYWcgPSBzdGFuZFRhZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWcucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxpc3RQYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgbGluZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBwcmV2Tm9kZU5hbWUgPSAnJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByYW5nZUxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lID0gcmFuZ2VMaW5lc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoL15MSSQvaS50ZXN0KGxpbmUubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RQYXJlbnQgPT09IG51bGwgfHwgIS9eTEkkL2kudGVzdChwcmV2Tm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQobGluZS5wYXJlbnROb2RlLm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQuYXBwZW5kQ2hpbGQobGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEgfHwgIS9eTEkkL2kudGVzdChyYW5nZUxpbmVzW2kgKyAxXS5ub2RlTmFtZSkpIHdyYXBUYWcuYXBwZW5kQ2hpbGQobGlzdFBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByZXZOb2RlTmFtZSA9IGxpbmUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBFbGVtZW50Lmluc2VydEJlZm9yZSh3cmFwVGFnLCBiZWZvcmVUYWcpO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCAmJiAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5zdGFydENvbnRhaW5lcikgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5lbmRDb250YWluZXIpKSkgdXRpbC5yZW1vdmVFbXB0eU5vZGUocEVsZW1lbnQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgdGhlIG5vZGUgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgdmFsdWUgdG8gdGhlIHNlbGVjdGVkIGFyZWEuXHJcbiAgICAgICAgICogMS4gV2hlbiB0aGVyZSBpcyB0aGUgc2FtZSBjc3MgdmFsdWUgbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGFyZWEsIHRoZSB0YWcgaXMgc3RyaXBwZWQuXHJcbiAgICAgICAgICogMi4gSWYgdGhlcmUgaXMgYW5vdGhlciBjc3MgdmFsdWUgb3RoZXIgdGhhbkNzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50cyBvbiB0aGUgbm9kZSwgcmVtb3ZlZCBvbmx5IENzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50c1xyXG4gICAgICAgICAqIDMuIElmIHlvdSBwYXNzIGFuIGVsZW1lbnQgd2hvc2Ugbm9kZSBuYW1lIGlzIFwicmVtb3Zlbm9kZVwiIGFzIGFuIGFyZ3VtZW50IHZhbHVlLCBpdCBwZXJmb3JtcyBhIHR5cGUgcmVtb3ZhbCBvcGVyYXRpb24uIGV4KSBub2RlQ2hhbmdlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlbW92ZW5vZGUnKSlcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFwcGVuZE5vZGUgLSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjaGVja0NTU1Byb3BlcnR5QXJyYXkgLSBUaGUgY3NzIGF0dHJpYnV0ZSBuYW1lIEFycmF5IHRvIGNoZWNrIChbJ2ZvbnQtc2l6ZSddLCBbJ2ZvbnQtZmFtaWx5JywgJ2JhY2tncm91bmQtY29sb3InLCAnYm9yZGVyJ10uLi5dKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vZGVDaGFuZ2U6IGZ1bmN0aW9uIChhcHBlbmROb2RlLCBjaGVja0NTU1Byb3BlcnR5QXJyYXkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3ZlRm9ybWF0ID0gL3JlbW92ZW5vZGUvaS50ZXN0KGFwcGVuZE5vZGUubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICBsZXQgdGVtcENvbiwgdGVtcE9mZnNldCwgdGVtcENoaWxkLCB0ZW1wQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAvKiBjaGVja2VkIHNhbWUgc3R5bGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByYW5nZS5lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChzTm9kZSkgPT09IHNOb2RlLnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ250ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIXV0aWwuaXNGb3JtYXRFbGVtZW50KHNOb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYoc05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc05vZGUubm9kZVR5cGUgPT09IDEgJiYgc05vZGUuc3R5bGVbY2hlY2tDU1NQcm9wZXJ0eUFycmF5W2ldXSA9PT0gYXBwZW5kTm9kZS5zdHlsZVtjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDbnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNOb2RlID0gc05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NudCA+PSBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIGZpbmQgdGV4dCBub2RlICovXHJcbiAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkIDogcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZW1wQ29uLm5vZGVUeXBlID09PSAxICYmIHRlbXBDb24uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGVtcENvbiAmJiAhdXRpbC5pc0JyZWFrKHRlbXBDb24pICYmIHRlbXBDb24ubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGQgPSB0ZW1wQ29uLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRlbXBDaGlsZC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkucHVzaCh0ZW1wQ2hpbGRbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uID0gdGVtcEFycmF5W3RlbXBPZmZzZXRdIHx8IHRlbXBDb24ubmV4dEVsZW1lbnRTaWJsaW5nIHx8IHRlbXBDb24ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gdGVtcENvbjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRPZmYgPSB0ZW1wT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5lbmRDb250YWluZXIpID8gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcubGFzdENoaWxkIDogcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXBDb24ubm9kZVR5cGUgPT09IDEgJiYgdGVtcENvbi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wQ29uICYmICF1dGlsLmlzQnJlYWsodGVtcENvbikgJiYgdGVtcENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZCA9IHRlbXBDb24uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGVtcENoaWxkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHRlbXBDaGlsZFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSB0ZW1wQXJyYXlbdGVtcE9mZnNldCAtIDFdIHx8ICEvRklHVVJFL2kudGVzdCh0ZW1wQXJyYXlbMF0ubm9kZU5hbWUpID8gdGVtcEFycmF5WzBdIDogKHRlbXBDb24ucHJldmlvdXNFbGVtZW50U2libGluZyB8fCB0ZW1wQ29uLnByZXZpb3VzU2libGluZyB8fCBzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gdGVtcENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHRlbXBDb247XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHRlbXBPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdOb2RlTmFtZSA9IGFwcGVuZE5vZGUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uoc3RhcnRDb24sIHN0YXJ0T2ZmLCBlbmRDb24sIGVuZE9mZik7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB7fSwgZW5kID0ge307XHJcbiAgICAgICAgICAgIGxldCBuZXdOb2RlLCByZWdFeHA7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hlY2tDU1NQcm9wZXJ0eUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgPSAnKD86O3xefFxcXFxzKSg/OicgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbMF07XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoZWNrQ1NTUHJvcGVydHlBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ0V4cCArPSAnfCcgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgKz0gJylcXFxccyo6W147XSpcXFxccyooPzo7fCQpJztcclxuICAgICAgICAgICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVnRXhwLCAnaWcnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHRhZyBjaGVjayBmdW5jdGlvbiovXHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3NzID0gZnVuY3Rpb24gKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQgfHwgdk5vZGUubm9kZVR5cGUgPT09IDMgfHwgdXRpbC5pc0JyZWFrKHZOb2RlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gdk5vZGUuc3R5bGUuY3NzVGV4dC5yZXBsYWNlKHJlZ0V4cCwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubGVuZ3RoID4gMCB8fCB2Tm9kZS5ub2RlTmFtZSAhPT0gbmV3Tm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUuc3R5bGUuY3NzVGV4dC5sZW5ndGggPiAwKSB2Tm9kZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLyoqIG9uZSBsaW5lICovXHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSAmJiAhdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLl9ub2RlQ2hhbmdlX29uZUxpbmUodXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbW1vbkNvbiksIG5ld05vZGUsIGNoZWNrQ3NzLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgcmFuZ2UuY29sbGFwc2VkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFydC5jb250YWluZXIgPSBuZXdSYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Lm9mZnNldCA9IG5ld1JhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZW5kLmNvbnRhaW5lciA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGVuZC5vZmZzZXQgPSBuZXdSYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqIG11bHRpIGxpbmUgKi9cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZU5vZGVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBsaW5lTm9kZXMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydENvblxyXG4gICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbm9kZUNoYW5nZV9zdGFydExpbmUobGluZU5vZGVzWzBdLCBuZXdOb2RlLCBjaGVja0Nzcywgc3RhcnRDb24sIHN0YXJ0T2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGVuZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUobGluZU5vZGVzW2ldLCBuZXdOb2RlLCBjaGVja0NzcywgaXNSZW1vdmVGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGVuZENvblxyXG4gICAgICAgICAgICAgICAgaWYgKGVuZExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX25vZGVDaGFuZ2VfZW5kTGluZShsaW5lTm9kZXNbZW5kTGVuZ3RoXSwgbmV3Tm9kZSwgY2hlY2tDc3MsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzdGFydC5jb250YWluZXIsIHN0YXJ0Lm9mZnNldCwgZW5kLmNvbnRhaW5lciwgZW5kLm9mZnNldCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIHRleHQgbm9kZXMgb2YgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmYgLSBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgLSBJcyB0aGUgcmVtb3ZlIGZvcm1hdCBjb21tYW5kID9cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbGxhcHNlZCAtIHJhbmdlLmNvbGxhcHNlZFxyXG4gICAgICAgICAqIEByZXR1cm5zIHt7c3RhcnRDb250YWluZXI6ICosIHN0YXJ0T2Zmc2V0OiAqLCBlbmRDb250YWluZXI6ICosIGVuZE9mZnNldDogKn19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9vbmVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2FtZU5vZGUgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRDb250YWluZXIgPSBzdGFydENvbjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBlbmRDb250YWluZXIgPSBlbmRDb247XHJcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBlbmRPZmY7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGVuZFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlLCBjc3NUZXh0O1xyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tDc3MgKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKCcoPzo7fF58XFxcXHMpKD86JyArIGNzc1RleHQgKyAnbnVsbClcXFxccyo6W147XSpcXFxccyooPzo7fCQpJywgJ2lnJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gcmVnRXhwLnRlc3Qodk5vZGUuc3R5bGUuY3NzVGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFzdHlsZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0UGFzcyAmJiBjaGlsZCA9PT0gc3RhcnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBzdGFydENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKDAsIHN0YXJ0T2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogc3RhcnRDb250YWluZXIuc3Vic3RyaW5nRGF0YShzdGFydE9mZnNldCwgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0ID8gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQgOiBzdGFydE9mZnNldCAtIGVuZE9mZnNldCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQocHJldk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKG5ld05vZGUpICYmIG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlICE9PSB0ZXh0Tm9kZSkgbmV3Tm9kZS5hcHBlbmRDaGlsZChzdGFydENvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTYW1lTm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MgJiYgY2hpbGQgPT09IGVuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogZW5kQ29udGFpbmVyLnN1YnN0cmluZ0RhdGEoZW5kT2Zmc2V0LCAoZW5kQ29udGFpbmVyLmxlbmd0aCAtIGVuZE9mZnNldCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGlzU2FtZU5vZGUgfHwgZW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBlbmRDb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBlbmRPZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IGFmdGVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUudGV4dENvbnRlbnQgPSBhZnRlck5vZGUuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIGNoZWNrQ3NzKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXIgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGUudGV4dENvbnRlbnQgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSAhPT0gdGV4dE5vZGUpIG5ld05vZGUuYXBwZW5kQ2hpbGQoZW5kQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBhc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSAmJiAoZW5kUGFzcyB8fCB2YWxpZGF0aW9uKG5ld05vZGUpKSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgPT09IGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MpIG5vZGUgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG5vZGUgPSBwTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRQYXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoZWxlbWVudCwgcE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VkID8gdXRpbC56ZXJvV2lkdGhTcGFjZSA6IG5ld0lubmVyTm9kZS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUoc3RhcnRDb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkgc3RhcnRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyOiBpc1JlbW92ZUZvcm1hdCB8fCAhZW5kQ29udGFpbmVyLnRleHRDb250ZW50ID8gc3RhcnRDb250YWluZXIgOiBlbmRDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGlzUmVtb3ZlRm9ybWF0IHx8ICFlbmRDb250YWluZXIudGV4dENvbnRlbnQgPyBzdGFydENvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGggOiBlbmRPZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbWlkIGxpbmVzIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlRm9ybWF0IC0gSXMgdGhlIHJlbW92ZSBmb3JtYXQgY29tbWFuZCA/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9taWRkbGVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoZWxlbWVudC50ZXh0Q29udGVudCA/IGVsZW1lbnQudGV4dENvbnRlbnQgOiB1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKGVsZW1lbnQsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgZmlyc3QgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2Vfc3RhcnRMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzdGFydE9mZjtcclxuICAgICAgICAgICAgbGV0IHBhc3NOb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBwQ3VycmVudCwgbmV3Tm9kZSwgYXBwZW5kTm9kZTtcclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjdXJyZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY292ZXJOb2RlID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NOb2RlICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBuZXdJbm5lck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIHZhbGlkYXRpb24obmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlICYmIGNoaWxkID09PSBjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgb2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShjb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGNvbnRhaW5lci5zdWJzdHJpbmdEYXRhKG9mZnNldCwgKGNvbnRhaW5lci5sZW5ndGggLSBvZmZzZXQpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHByZXZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB2YWxpZGF0aW9uKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgIT09IG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NOb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlIHx8IHZhbGlkYXRpb24oY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KShlbGVtZW50LCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3SW5uZXJOb2RlLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBOb2RlLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbGFzdCBsaW5lIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVuZENvbiAtIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiAtIFRoZSBlbmRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2VfZW5kTGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gZW5kT2ZmO1xyXG4gICAgICAgICAgICBsZXQgcGFzc05vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlO1xyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtMTsgMCA8PSBpOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzTm9kZSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5ld0lubmVyTm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzTm9kZSAmJiBjaGlsZCA9PT0gY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YShvZmZzZXQsIChjb250YWluZXIubGVuZ3RoIC0gb2Zmc2V0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBvZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZShhZnRlck5vZGUsIG5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gcE5vZGUgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24obmV3Tm9kZSkgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlICE9PSBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgbmV3SW5uZXJOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0lubmVyTm9kZSwgcE5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB0ZXh0Tm9kZS5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc05vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc05vZGUgfHwgdmFsaWRhdGlvbihjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvbmVOb2RlID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVOb2RlLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShuZXdJbm5lck5vZGUudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gZWxlbWVudC5jaGlsZE5vZGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlRW1wdHlOb2RlKHBOb2RlKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGNvbW1hbmQgb2YgY29tbWFuZCBidXR0b24oQWxsIEJ1dHRvbnMgZXhjZXB0IHN1Ym1lbnUgYW5kIGRpYWxvZylcclxuICAgICAgICAgKiAocmVkbywgdW5kbywgYm9sZCwgdW5kZXJsaW5lLCBpdGFsaWMsIHN0cmlrZXRocm91Z2gsIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQsIHJlbW92ZUZvcm1hdCwgaW5kZW50LCBvdXRkZW50LCBmdWxsc2NyZWVuLCBzaG93QmxvY2tzLCBjb2RldmlldywgcHJldmlldywgcHJpbnQpXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBUaGUgZWxlbWVudCBvZiBjb21tYW5kIGJ1dHRvblxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21tYW5kIC0gUHJvcGVydHkgb2YgY29tbWFuZCBidXR0b24gKGRhdGEtdmFsdWUpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29tbWFuZEhhbmRsZXI6IGZ1bmN0aW9uICh0YXJnZXQsIGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlVmlldyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29kZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmdWxsU2NyZWVuJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVGdWxsU2NyZWVuKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5kZW50JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ291dGRlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncmVkbyc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRvJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZvcm1hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAncHJpbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbldpbmRvd0NvbnRlbnRzKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc2hvd0Jsb2Nrcyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVEaXNwbGF5QmxvY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3Vic2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3VwZXJzY3JpcHQsICdvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoJ3N1cGVyc2NyaXB0JywgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQudG9vbC5zdXBlcnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N1cGVyc2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3Vic2NyaXB0LCAnb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKCdzdWJzY3JpcHQnLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC50b29sLnN1YnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiAvLyAnYm9sZCcsICd1bmRlcmxpbmUnLCAnaXRhbGljJywgJ3N0cmlrZSdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgZm9ybWF0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UgKElFLCBFZGdlIG5vdCB3b3JraW5nKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlbW92ZUZvcm1hdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UodXRpbC5jcmVhdGVFbGVtZW50KCdSRU1PVkVOT0RFJykpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIGluZGVudGF0aW9uIHRvIHNlbGVjdGVkIHJhbmdlLlxyXG4gICAgICAgICAqIFNldHRlZCBcIm1hcmdpbi1sZWZ0XCIgdG8gXCIyNXB4XCIgaW4gdGhlIHRvcCBcIlBcIiB0YWcgb2YgdGhlIHBhcmFtZXRlciBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSBjb21tYW5kIHtTdHJpbmd9IC0gU2VwYXJhdG9yIChcImluZGVudFwiIG9yIFwib3V0ZGVudFwiKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluZGVudDogZnVuY3Rpb24gKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VMaW5lcyA9IHRoaXMuZ2V0U2VsZWN0ZWRGb3JtYXRFbGVtZW50cygpO1xyXG4gICAgICAgICAgICBsZXQgcCwgbWFyZ2luO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlTGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHAgPSByYW5nZUxpbmVzW2ldO1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luID0gL1xcZCsvLnRlc3QocC5zdHlsZS5tYXJnaW5MZWZ0KSA/IHAuc3R5bGUubWFyZ2luTGVmdC5tYXRjaCgvXFxkKy8pWzBdICogMSA6IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCdpbmRlbnQnID09PSBjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luICs9IDI1O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gLT0gMjU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHAuc3R5bGUubWFyZ2luTGVmdCA9IChtYXJnaW4gPCAwID8gMCA6IG1hcmdpbikgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBvciByZW1vdmUgdGhlIGNsYXNzIG5hbWUgb2YgXCJib2R5XCIgc28gdGhhdCB0aGUgY29kZSBibG9jayBpcyB2aXNpYmxlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlRGlzcGxheUJsb2NrczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKGNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc3VuLWVkaXRvci1zaG93LWJsb2NrJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZXMgdG8gY29kZSB2aWV3IG9yIHd5c2l3eWcgdmlld1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUNvZGVWaWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHd5c2l3eWdBY3RpdmUgPSB0aGlzLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlO1xyXG4gICAgICAgICAgICBjb25zdCBkaXNCdXR0b25zID0gdGhpcy5jb2RlVmlld0Rpc2FibGVkQnV0dG9ucztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGRpc0J1dHRvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGRpc0J1dHRvbnNbaV0uZGlzYWJsZWQgPSB3eXNpd3lnQWN0aXZlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVfaHRtbCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCA9IGNvZGVfaHRtbC5sZW5ndGggPiAwID8gdXRpbC5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29kZV9odG1sKSA6ICc8cD4nICsgdXRpbC56ZXJvV2lkdGhTcGFjZSArICc8L3A+JztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5vcHRpb24uaGVpZ2h0ID09PSAnYXV0bycpIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSA9IHV0aWwuY29udmVydEhUTUxGb3JDb2RlVmlldyhjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwudHJpbSgpKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ID4gMCA/IChjb250ZXh0LmVsZW1lbnQuY29kZS5zY3JvbGxIZWlnaHQgKyAncHgnKSA6ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2hhbmdlcyB0byBmdWxsIHNjcmVlbiBvciBkZWZhdWx0IHNjcmVlblxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIGZ1bGwgc2NyZWVuIGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW46IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnpJbmRleCA9ICcyMTQ3NDgzNjQ3JztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fYm9keU92ZXJmbG93ID0gX2QuYm9keS5zdHlsZS5vdmVyZmxvdztcclxuICAgICAgICAgICAgICAgIF9kLmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX3d5c2l3eWdPcmlnaW5Dc3NUZXh0ID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9jb2RlT3JpZ2luQ3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmNzc1RleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUud2lkdGggPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5oZWlnaHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiA9IChfdy5pbm5lckhlaWdodCAtIGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5oZWlnaHQgPSB0aGlzLl92YXJpYWJsZS5pbm5lckhlaWdodF9mdWxsU2NyZWVuICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLWV4cGFuc2lvbicpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1yZWR1Y3Rpb24nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fY29kZU9yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0ID0gdGhpcy5fdmFyaWFibGUuX3d5c2l3eWdPcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUuY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fb3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIF9kLmJvZHkuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLl92YXJpYWJsZS5fYm9keU92ZXJmbG93O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQuZWxlbWVudC50b29sYmFyLCAnc3VuLWVkaXRvci1zdGlja3knKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLXJlZHVjdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1leHBhbnNpb24nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIHRoZSBwcmV2aWV3IHdpbmRvdyBvciBvcGVuIHRoZSBwcmludCB3aW5kb3dcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kZSAtICdwcmV2aWV3JyBvciAncHJpbnQnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb3BlbldpbmRvd0NvbnRlbnRzOiBmdW5jdGlvbiAobW9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpc1ByaW50ID0gbW9kZSA9PT0gJ3ByaW50JztcclxuICAgICAgICAgICAgY29uc3Qgd2luZG93T2JqZWN0ID0gX3cub3BlbignJywgJ19ibGFuaycpO1xyXG4gICAgICAgICAgICB3aW5kb3dPYmplY3QubWltZVR5cGUgPSAndGV4dC9odG1sJztcclxuICAgICAgICAgICAgd2luZG93T2JqZWN0LmRvY3VtZW50LndyaXRlKCcnICtcclxuICAgICAgICAgICAgICAgICc8IWRvY3R5cGUgaHRtbD48aHRtbD4nICtcclxuICAgICAgICAgICAgICAgICc8aGVhZD4nICtcclxuICAgICAgICAgICAgICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPicgK1xyXG4gICAgICAgICAgICAgICAgJzxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPicgK1xyXG4gICAgICAgICAgICAgICAgJzx0aXRsZT4nICsgKGlzUHJpbnQgPyBsYW5nLnRvb2xiYXIucHJpbnQgOiBsYW5nLnRvb2xiYXIucHJldmlldykgKyAnPC90aXRsZT4nICtcclxuICAgICAgICAgICAgICAgICc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIicgKyB1dGlsLmdldEluY2x1ZGVQYXRoKFsnc3VuZWRpdG9yLWNvbnRlbnRzJywgJ3N1bmVkaXRvciddLCAnY3NzJykgKyAnXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9oZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgJzxib2R5PicgK1xyXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzdW4tZWRpdG9yLWVkaXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDonICsgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcub2Zmc2V0V2lkdGggKyAncHg7IG1hcmdpbjphdXRvO1wiPicgK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb250ZW50cygpICsgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgKGlzUHJpbnQgPyAnPHNjcmlwdD5fdy5wcmludCgpOzwvc2NyaXB0PicgOiAnJykgKyAnPC9ib2R5PicgK1xyXG4gICAgICAgICAgICAgICAgJzwvaHRtbD4nKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBjb250ZW50c1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0Q29udGVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRzID0gJyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBjb250ZW50cztcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMgPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckhUTUwgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgICAgICByZW5kZXJIVE1MLmlubmVySFRNTCA9IGNvbnRlbnRzO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlnY2FwdGlvbnMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihyZW5kZXJIVE1MLCBmdW5jdGlvbiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC9GSUdDQVBUSU9OL2kudGVzdChjdXJyZW50Lm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZmlnY2FwdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb25zW2ldLm91dGVySFRNTCA9IGZpZ2NhcHRpb25zW2ldLm91dGVySFRNTC5yZXBsYWNlKC8oPyFePGZpZ2NhcHRpb25cXHMrKShjb250ZW50ZWRpdGFibGU9XCIoW2Etel0rfFxccyopXCIpXFxzKig/PVtePl0qPikvaSwgJycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVySFRNTC5pbm5lckhUTUw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBldmVudCBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBjb25zdCBldmVudCA9IHtcclxuICAgICAgICBfc2hvcnRjdXRLZXlDb2RlOiB7XHJcbiAgICAgICAgICAgIDY2OiBbJ2JvbGQnLCAnQiddLFxyXG4gICAgICAgICAgICA4MzogWydzdHJpa2V0aHJvdWdoJywgJ1NUUklLRSddLFxyXG4gICAgICAgICAgICA4NTogWyd1bmRlcmxpbmUnLCAnVSddLFxyXG4gICAgICAgICAgICA3MzogWydpdGFsaWMnLCAnSSddLFxyXG4gICAgICAgICAgICA4OTogWydyZWRvJ10sXHJcbiAgICAgICAgICAgIDkwOiBbJ3VuZG8nXSxcclxuICAgICAgICAgICAgMjE5OiBbJ291dGRlbnQnXSxcclxuICAgICAgICAgICAgMjIxOiBbJ2luZGVudCddXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2RpcmVjdGlvbktleUtleUNvZGU6IG5ldyBSZWdFeHAoJ14oPzo4fDEzfDMyfDQ2fDMzfDM0fDM1fDM2fDM3fDM4fDM5fDQwfDk4fDEwMHwxMDJ8MTA0KSQnKSxcclxuXHJcbiAgICAgICAgX2NoYW5nZUJ1dHRvbkNsYXNzVGFnQ2hlY2s6IG5ldyBSZWdFeHAoJ14oPzpCfFV8SXxTVFJJS0V8U1VCfFNVUCkkJyksXHJcblxyXG4gICAgICAgIF9maW5kQnV0dG9uRWZmZWN0VGFnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRNYXAgPSBlZGl0b3IuY29tbWFuZE1hcDtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NPbkNoZWNrID0gdGhpcy5fY2hhbmdlQnV0dG9uQ2xhc3NUYWdDaGVjaztcclxuICAgICAgICAgICAgY29uc3QgY29tbWFuZE1hcE5vZGVzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbmRGb3JtYXQgPSB0cnVlLCBmaW5kRm9udCA9IHRydWUsIGZpbmRTaXplID0gdHJ1ZSwgZmluZEEgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgZmluZEIgPSB0cnVlLCBmaW5kSSA9IHRydWUsIGZpbmRVID0gdHJ1ZSwgZmluZFMgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgY3NzVGV4dCA9ICcnLCBub2RlTmFtZSA9ICcnO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgc2VsZWN0aW9uUGFyZW50ID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTsgIXV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvblBhcmVudCk7IHNlbGVjdGlvblBhcmVudCA9IHNlbGVjdGlvblBhcmVudC5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvblBhcmVudCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFyZW50Lm5vZGVUeXBlICE9PSAxKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gc2VsZWN0aW9uUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZXMucHVzaChub2RlTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIEZvcm1hdCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRGb3JtYXQgJiYgdXRpbC5pc0Zvcm1hdEVsZW1lbnQoc2VsZWN0aW9uUGFyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdGT1JNQVQnKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZVR4dChjb21tYW5kTWFwLkZPUk1BVCwgbm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRGb3JtYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogRm9udCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRGb250ICYmIChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udEZhbWlseS5sZW5ndGggPiAwIHx8IChzZWxlY3Rpb25QYXJlbnQuZmFjZSAmJiBzZWxlY3Rpb25QYXJlbnQuZmFjZS5sZW5ndGggPiAwKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnRk9OVCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEZvbnQgPSAoc2VsZWN0aW9uUGFyZW50LnN0eWxlLmZvbnRGYW1pbHkgfHwgc2VsZWN0aW9uUGFyZW50LmZhY2UgfHwgbGFuZy50b29sYmFyLmZvbnQpLnJlcGxhY2UoL1tcIiddL2csJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXAuRk9OVCwgc2VsZWN0Rm9udCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEZvbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogQSAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRBICYmIC9eQSQvLnRlc3Qobm9kZU5hbWUpICYmIHNlbGVjdGlvblBhcmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW1hZ2UtbGluaycpID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmxpbmsgfHwgZWRpdG9yLmNvbnRyb2xsZXJBcnJheVswXSAhPT0gY29udGV4dC5saW5rLmxpbmtCdG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2xpbmsnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5saW5rLmNhbGxfY29udHJvbGxlcl9saW5rQnV0dG9uLmNhbGwoZWRpdG9yLCBzZWxlY3Rpb25QYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmluZEEgJiYgY29udGV4dC5saW5rICYmIGVkaXRvci5jb250cm9sbGVyQXJyYXlbMF0gPT09IGNvbnRleHQubGluay5saW5rQnRuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIFNQQU4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kU2l6ZSAmJiAvXlNQQU4kLy50ZXN0KG5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qKiBmb250IHNpemUgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFyZW50LnN0eWxlLmZvbnRTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ1NJWkUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcC5TSVpFLCBzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udFNpemUubWF0Y2goL1xcZCsvKVswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTaXplID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKiBjb21tYW5kIG1hcCAqL1xyXG4gICAgICAgICAgICAgICAgY3NzVGV4dCA9IHNlbGVjdGlvblBhcmVudC5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRCICYmIC9mb250XFwtd2VpZ2h0XFxzKjpcXHMqKD86XFxkK3xib2xkfGJvbGRlcikoPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0InKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kQiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRJICYmIC9mb250XFwtc3R5bGVcXHMqOlxccyooPzppdGFsaWN8b2JsaXF1ZSkoPzo7fFxccykvLnRlc3QoY3NzVGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnSScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRJID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFUgJiYgL3RleHRcXC1kZWNvcmF0aW9uKD86XFwtbGluZSk/XFxzKjpcXHMqdW5kZXJsaW5lKD86O3xcXHN8KS8udGVzdChjc3NUZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdVJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZFUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kUyAmJiAvdGV4dFxcLWRlY29yYXRpb24oPzpcXC1saW5lKT9cXHMqOlxccypsaW5lLXRocm91Z2goPzo7fFxcc3wpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ1NUUklLRScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRTID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goKC9eU1RST05HJC8udGVzdChub2RlTmFtZSkgPyAnQicgOiAvXkVNJC8udGVzdChub2RlTmFtZSkgPyAnSScgOiBub2RlTmFtZSkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogQSBUYWcgZWRpdCBjb250cm9sbGVyIG9mZiAqL1xyXG4gICAgICAgICAgICBpZiAoZmluZEEpIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG5cclxuICAgICAgICAgICAgLyoqIHRvZ2dsZSBjbGFzcyBvbiAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1hbmRNYXBOb2Rlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBjb21tYW5kTWFwTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NPbkNoZWNrLnRlc3Qobm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb21tYW5kTWFwW25vZGVOYW1lXSwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgY2xhc3MsIGRpc3BsYXkgdGV4dCAqL1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY29tbWFuZE1hcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRNYXBOb2Rlcy5pbmRleE9mKGtleSkgPiAtMSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoL15GT05UL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvXlNJWkUkL2kudGVzdChrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcFtrZXldLCBsYW5nLnRvb2xiYXIuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb21tYW5kTWFwW2tleV0sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogc2F2ZSBjdXJyZW50IG5vZGVzICovXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzID0gY3VycmVudE5vZGVzLnJldmVyc2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiAgRGlzcGxheXMgdGhlIGN1cnJlbnQgbm9kZSBzdHJ1Y3R1cmUgdG8gcmVzaXppbmdCYXIgKi9cclxuICAgICAgICAgICAgaWYgKGNvbnRleHQub3B0aW9uLnNob3dQYXRoTGFiZWwpIGNvbnRleHQuZWxlbWVudC5uYXZpZ2F0aW9uLnRleHRDb250ZW50ID0gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXMuam9pbignID4gJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2NhbmNlbENhcHRpb25FZGl0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9jYW5jZWxDYXB0aW9uRWRpdCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fdG9vbGJhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldCwgJy5zdW4tZWRpdG9yLXN1Ym1lbnUnKSkge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgd2hpbGUgKCFjb21tYW5kICYmICEvZWRpdG9yX3Rvb2wvLnRlc3QoY2xhc3NOYW1lKSAmJiAhL3N1bi1lZGl0b3ItaWQtdG9vbGJhci8udGVzdChjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kID09PSBlZGl0b3IuX3N1Ym1lbnVOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3Rvb2xiYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSBlLnRhcmdldDtcclxuICAgICAgICAgICAgbGV0IGRpc3BsYXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWRpc3BsYXknKTtcclxuICAgICAgICAgICAgbGV0IGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAoIWNvbW1hbmQgJiYgIS9lZGl0b3JfdG9vbC8udGVzdChjbGFzc05hbWUpICYmICEvc3VuLWVkaXRvci1pZC10b29sYmFyLy50ZXN0KGNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgZGlzcGxheSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzcGxheScpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdGFyZ2V0LmNsYXNzTmFtZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFjb21tYW5kICYmICFkaXNwbGF5KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8qKiBEaWFsb2csIFN1Ym1lbnUgKi9cclxuICAgICAgICAgICAgaWYgKGRpc3BsYXkpIHtcclxuICAgICAgICAgICAgICAgIGlmICgvc3VibWVudS8udGVzdChkaXNwbGF5KSAmJiAodGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyA9PT0gbnVsbCB8fCB0YXJnZXQgIT09IGVkaXRvci5zdWJtZW51QWN0aXZlQnV0dG9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5jYWxsUGx1Z2luKGNvbW1hbmQsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnN1Ym1lbnVPbih0YXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKC9kaWFsb2cvLnRlc3QoZGlzcGxheSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbihjb21tYW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmRpYWxvZy5vcGVuLmNhbGwoZWRpdG9yLCBjb21tYW5kLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGVkaXRvci5zdWJtZW51T2ZmKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiBkZWZhdWx0IGNvbW1hbmQgKi9cclxuICAgICAgICAgICAgaWYgKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNvbW1hbmRIYW5kbGVyKHRhcmdldCwgY29tbWFuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbk1vdXNlVXBfd3lzaXd5ZzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBlZGl0b3IuX2VkaXRvclJhbmdlKCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoZWRpdG9yLl9pc0JhbGxvb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZWRpdG9yLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZXZlbnQuX3Nob3dUb29sYmFyQmFsbG9vbihyYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkNsaWNrX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlLnRhcmdldDtcclxuXHJcbiAgICAgICAgICAgIGlmICgvXklNRyQvaS50ZXN0KHRhcmdldEVsZW1lbnQubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbignaW1hZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVkaXRvci5wbHVnaW5zLnJlc2l6aW5nLmNhbGxfY29udHJvbGxlcl9yZXNpemUuY2FsbChlZGl0b3IsIHRhcmdldEVsZW1lbnQsICdpbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLm9uTW9kaWZ5TW9kZS5jYWxsKGVkaXRvciwgdGFyZ2V0RWxlbWVudCwgc2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0RWxlbWVudCwgJy5zdW4tZWRpdG9yLWlkLWltYWdlLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLm9wZW5Nb2RpZnkuY2FsbChlZGl0b3IsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5pbWFnZS51cGRhdGVfaW1hZ2UuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgvc3VuLWVkaXRvci1pZC1pZnJhbWUtaW5uZXItcmVzaXppbmctY292ZXIvaS50ZXN0KHRhcmdldEVsZW1lbnQuY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ3ZpZGVvJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZSA9IHV0aWwuZ2V0Q2hpbGRFbGVtZW50KHRhcmdldEVsZW1lbnQucGFyZW50Tm9kZSwgJ2lmcmFtZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBlZGl0b3IucGx1Z2lucy5yZXNpemluZy5jYWxsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwoZWRpdG9yLCBpZnJhbWUsICd2aWRlbycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLnZpZGVvLm9uTW9kaWZ5TW9kZS5jYWxsKGVkaXRvciwgaWZyYW1lLCBzaXplKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQuX2ZpbmRCdXR0b25FZmZlY3RUYWcoKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpZ2NhcHRpb24gPSB1dGlsLmdldFBhcmVudEVsZW1lbnQodGFyZ2V0RWxlbWVudCwgJ0ZJR0NBUFRJT04nKTtcclxuICAgICAgICAgICAgaWYgKGZpZ2NhcHRpb24gJiYgZmlnY2FwdGlvbi5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpICE9PSAndHVyZScpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb24uZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLl9pc0lubGluZSAmJiAhZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci5pc1Nob3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5fc2hvd1Rvb2xiYXJJbmxpbmUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkZVRvb2xiYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9oaWRlVG9vbGJhcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVUb29sYmFyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRkID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsIHV0aWwuaXNDZWxsKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3IuY29udHJvbGxlckFycmF5Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbigndGFibGUnLCBlZGl0b3IucGx1Z2lucy50YWJsZS5jYWxsX2NvbnRyb2xsZXJfdGFibGVFZGl0LmJpbmQoZWRpdG9yLCB0ZCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHVzZXJGdW5jdGlvbi5vbkNsaWNrKSB1c2VyRnVuY3Rpb24ub25DbGljayhlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd1Rvb2xiYXJCYWxsb29uOiBmdW5jdGlvbiAocmFuZ2VPYmopIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSByYW5nZU9iaiB8fCBlZGl0b3IuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgY29uc3QgcGFkZGluZyA9IDIwO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGV4dC5lbGVtZW50LnRvb2xiYXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IF93LmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGlzRGlyVG9wO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmZvY3VzTm9kZSA9PT0gc2VsZWN0aW9uLmFuY2hvck5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0IDwgc2VsZWN0aW9uLmFuY2hvck9mZnNldDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZE5vZGVzKHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIGlzRGlyVG9wID0gdXRpbC5nZXRBcnJheUluZGV4KGNoaWxkTm9kZXMsIHNlbGVjdGlvbi5mb2N1c05vZGUpIDwgdXRpbC5nZXRBcnJheUluZGV4KGNoaWxkTm9kZXMsIHNlbGVjdGlvbi5hbmNob3JOb2RlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHJlY3RzID0gcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKTtcclxuICAgICAgICAgICAgcmVjdHMgPSByZWN0c1tpc0RpclRvcCA/IDAgOiByZWN0cy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFyV2lkdGggPSB0b29sYmFyLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgICBjb25zdCB0b29sYmFySGVpZ2h0ID0gdG9vbGJhci5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBsZXQgbCA9IChpc0RpclRvcCA/IHJlY3RzLmxlZnQgOiByZWN0cy5yaWdodCkgLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRMZWZ0ICsgKF93LnNjcm9sbFggfHwgX2QuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpIC0gdG9vbGJhcldpZHRoIC8gMjtcclxuICAgICAgICAgICAgbGV0IHQgPSAoaXNEaXJUb3AgPyByZWN0cy50b3AgLSB0b29sYmFySGVpZ2h0IC0gMTEgOiByZWN0cy5ib3R0b20gKyAxMSkgLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRUb3AgKyAoX3cuc2Nyb2xsWSB8fCBfZC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJSaWdodCA9IGwgKyB0b29sYmFyV2lkdGggLSBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUubGVmdCA9IChsIDwgMCA/IHBhZGRpbmcgOiBvdmVyUmlnaHQgPCAwID8gbCA6IGwgLSBvdmVyUmlnaHQgLSBwYWRkaW5nKSArICdweCc7XHJcbiAgICAgICAgICAgIHRvb2xiYXIuc3R5bGUudG9wID0gKHQpICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0RpclRvcCkge1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhjb250ZXh0LmVsZW1lbnQuX2Fycm93LCAnYXJyb3ctdXAnKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LWRvd24nKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUudG9wID0gKHRvb2xiYXJIZWlnaHQpICsgJ3B4JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LWRvd24nKTtcclxuICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LXVwJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuX2Fycm93LnN0eWxlLnRvcCA9ICctMTFweCc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93X3dpZHRoID0gY29udGV4dC5lbGVtZW50Ll9hcnJvdy5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXJyb3dfbGVmdCA9ICh0b29sYmFyV2lkdGggLyAyICsgKGwgPCAwID8gbCAtIGFycm93X3dpZHRoIDogb3ZlclJpZ2h0IDwgMCA/IDAgOiBvdmVyUmlnaHQgKyBhcnJvd193aWR0aCkpO1xyXG4gICAgICAgICAgICBjb25zdCBhcnJvd19wb2ludF93aWR0aCA9IGFycm93X3dpZHRoIC8gMjtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9hcnJvdy5zdHlsZS5sZWZ0ID0gKGFycm93X2xlZnQgPCBhcnJvd19wb2ludF93aWR0aCA/IGFycm93X3BvaW50X3dpZHRoIDogYXJyb3dfbGVmdCArIGFycm93X3BvaW50X3dpZHRoID49IHRvb2xiYXJXaWR0aCA/IGFycm93X2xlZnQgLSBhcnJvd19wb2ludF93aWR0aCA6IGFycm93X2xlZnQpICsgJ3B4JztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfc2hvd1Rvb2xiYXJJbmxpbmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyO1xyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLndpZHRoID0gdG9vbGJhci5zdHlsZS53aWR0aCA9IGNvbnRleHQub3B0aW9uLnRvb2xiYXJXaWR0aDtcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci50b3AgPSB0b29sYmFyLnN0eWxlLnRvcCA9ICgtMSAtIHRvb2xiYXIub2Zmc2V0SGVpZ2h0KSArICdweCc7XHJcbiAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdyA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2hpZGVUb29sYmFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIuaXNTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25LZXlEb3duX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBlLmtleUNvZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gZS5zaGlmdEtleTtcclxuICAgICAgICAgICAgY29uc3QgY3RybCA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFsdCA9IGUuYWx0S2V5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGV2ZW50Ll9zaG9ydGN1dEtleUNvZGVba2V5Q29kZV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWtleSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGVkaXRvci5jb21tYW5kSGFuZGxlcih1dGlsLmdldEZvcm1hdEVsZW1lbnQoZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKSksIGtleVswXSk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKGVkaXRvci5jb21tYW5kTWFwW2tleVsxXV0sICdvbicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogU2hvcnRjdXRzICovXHJcbiAgICAgICAgICAgIGlmIChjdHJsICYmICEvXig/OjE2fDE3fDE4KSQvLnRlc3Qoa2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKCFzaGlmdCAmJiBrZXlDb2RlID09PSA4MykgJiYgc2hvcnRjdXRDb21tYW5kKGtleUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIGRlZmF1bHQga2V5IGFjdGlvbiAqL1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Ob2RlID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDg6IC8qKmJhY2tzcGFjZSBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh1dGlsLmlzRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlKSAmJiB1dGlsLmlzV3lzaXd5Z0RpdihzZWxlY3Rpb25Ob2RlLnBhcmVudE5vZGUpICYmIHNlbGVjdGlvbk5vZGUucHJldmlvdXNTaWJsaW5nID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZS5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA5OlxyXG4gICAgICAgICAgICAgICAgICAgIC8qKnRhYiBrZXkqL1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY3RybCB8fCBhbHQpIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gc2VsZWN0aW9uTm9kZSB8fCBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlICghdXRpbC5pc0NlbGwoY3VycmVudE5vZGUpICYmICF1dGlsLmlzV3lzaXd5Z0RpdihjdXJyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlICYmIHV0aWwuaXNDZWxsKGN1cnJlbnROb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudChjdXJyZW50Tm9kZSwgJ3RhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdXRpbC5nZXRMaXN0Q2hpbGRyZW4odGFibGUsIHV0aWwuaXNDZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IHNoaWZ0ID8gdXRpbC5wcmV2SWR4KGNlbGxzLCBjdXJyZW50Tm9kZSkgOiB1dGlsLm5leHRJZHgoY2VsbHMsIGN1cnJlbnROb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IGNlbGxzLmxlbmd0aCAmJiAhc2hpZnQpIGlkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xICYmIHNoaWZ0KSBpZHggPSBjZWxscy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW92ZUNlbGwgPSBjZWxsc1tpZHhdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdmVDZWxsKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2UobW92ZUNlbGwsIDAsIG1vdmVDZWxsLCAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLyoqIGZvcm1hdCBUYWcgKi9cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5lcyA9IGVkaXRvci5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2hpZnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFiVGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3IEFycmF5KGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSArIDEpLmpvaW4oJ1xcdTAwQTAnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5pbnNlcnROb2RlKHRhYlRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFJhbmdlKHRhYlRleHQsIGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSwgdGFiVGV4dCwgZWRpdG9yLl92YXJpYWJsZS50YWJTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzW2ldLmluc2VydEJlZm9yZSh0YWJUZXh0LmNsb25lTm9kZShmYWxzZSksIGxpbmVzW2ldLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGxpbmVzLmxlbmd0aCwgY2hpbGQ7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBsaW5lc1tpXS5maXJzdENoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC9eXFxzezEsNH0kLy50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKC9eXFxzezEsNH0vLnRlc3QoY2hpbGQudGV4dENvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudC5yZXBsYWNlKC9eXFxzezEsNH0vLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uS2V5RG93bikgdXNlckZ1bmN0aW9uLm9uS2V5RG93bihlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbktleVVwX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk5vZGUgPSBlZGl0b3IuZ2V0U2VsZWN0aW9uTm9kZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uICYmICFlZGl0b3IuZ2V0UmFuZ2UoKS5jb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9zaG93VG9vbGJhckJhbGxvb24oKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHdoZW4gZm9ybWF0IHRhZyBkZWxldGVkICovXHJcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT09IDggJiYgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZSkgJiYgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcudGV4dENvbnRlbnQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG9Gb3JtYXRUYWcgPSB1dGlsLmNyZWF0ZUVsZW1lbnQodXRpbC5pc0Zvcm1hdEVsZW1lbnQoZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0pID8gZWRpdG9yLl92YXJpYWJsZS5jdXJyZW50Tm9kZXNbMF0gOiAnUCcpO1xyXG4gICAgICAgICAgICAgICAgb0Zvcm1hdFRhZy5pbm5lckhUTUwgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG5cclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUuYXBwZW5kQ2hpbGQob0Zvcm1hdFRhZyk7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc2V0UmFuZ2Uob0Zvcm1hdFRhZywgMCwgb0Zvcm1hdFRhZywgMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICgodXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSB8fCB1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KHNlbGVjdGlvbk5vZGUucGFyZW50RWxlbWVudCkpICYmIHNlbGVjdGlvbk5vZGUubm9kZVR5cGUgPT09IDMpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnZm9ybWF0QmxvY2snLCBmYWxzZSwgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnRFbGVtZW50KSA/ICdQJyA6ICdESVYnKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudC5fZGlyZWN0aW9uS2V5S2V5Q29kZS50ZXN0KGUua2V5Q29kZSkpIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25LZXlVcCkgdXNlckZ1bmN0aW9uLm9uS2V5VXAoZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25TY3JvbGxfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25TY3JvbGwpIHVzZXJGdW5jdGlvbi5vblNjcm9sbChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbkRyb3Bfd3lzaXd5ZzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBlLmRhdGFUcmFuc2Zlci5maWxlcztcclxuXHJcbiAgICAgICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgIFxyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2ltYWdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gZmlsZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2Uub25SZW5kZXJfaW1nSW5wdXQuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuaW1hZ2UuaW1nSW5wdXRGaWxlLmZpbGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uRHJvcCkgdXNlckZ1bmN0aW9uLm9uRHJvcChlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvbk1vdXNlRG93bl9yZXNpemluZ0JhcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSA9IGUuY2xpZW50WTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6ZUJhY2tncm91bmQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9zdXJlRnVuYygpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xvc3VyZUZ1bmMpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudC5fcmVzaXplX2VkaXRvcik7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBjbG9zdXJlRnVuYyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Jlc2l6ZV9lZGl0b3I6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZUludGVydmFsID0gY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0ICsgKGUuY2xpZW50WSAtIGVkaXRvci5fdmFyaWFibGUucmVzaXplQ2xpZW50WSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IChyZXNpemVJbnRlcnZhbCA8IGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplID8gZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgOiByZXNpemVJbnRlcnZhbCkgKyAncHgnO1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25SZXNpemVfd2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKz0gKF93LmlubmVySGVpZ2h0IC0gY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0KSAtIGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLmhlaWdodCA9IGVkaXRvci5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZWRpdG9yLl92YXJpYWJsZS5fc3RpY2t5KSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IChjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5vZmZzZXRXaWR0aCAtIDIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblNjcm9sbF93aW5kb3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUuaXNGdWxsU2NyZWVuIHx8IGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldFdpZHRoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29udGV4dC5lbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBlbGVtZW50LmVkaXRvckFyZWEub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0b3JUb3AgPSBlbGVtZW50LnRvcEFyZWEub2Zmc2V0VG9wIC0gKGVkaXRvci5faXNJbmxpbmUgPyBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0IDogMCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHkgPSAodGhpcy5zY3JvbGxZIHx8IF9kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhcjtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh5IDwgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb2ZmU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh5ICsgZWRpdG9yLl92YXJpYWJsZS5taW5SZXNpemluZ1NpemUgPj0gZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWVkaXRvci5fdmFyaWFibGUuX3N0aWNreSkgZXZlbnQuX29uU3RpY2t5VG9vbGJhcihlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSAoZWRpdG9ySGVpZ2h0ICsgZWRpdG9yVG9wICsgY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciAteSAtIGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplKSArICdweCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeSA+PSBlZGl0b3JUb3ApIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfb25TdGlja3lUb29sYmFyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBpZiAoIWVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmhlaWdodCA9IGVsZW1lbnQudG9vbGJhci5vZmZzZXRIZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5fc3RpY2t5RHVtbXkuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyICsgJ3B4JztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiBlbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB1dGlsLmFkZENsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IHRydWU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29mZlN0aWNreVRvb2xiYXI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS50b3AgPSBlZGl0b3IuX2lzSW5saW5lID8gZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci50b3AgOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC50b29sYmFyLnN0eWxlLndpZHRoID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIud2lkdGggOiAnJztcclxuICAgICAgICAgICAgZWxlbWVudC5lZGl0b3JBcmVhLnN0eWxlLm1hcmdpblRvcCA9ICcnO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQudG9vbGJhciwgJ3N1bi1lZGl0b3Itc3RpY2t5Jyk7XHJcbiAgICAgICAgICAgIGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jb2RlVmlld0F1dG9TY3JvbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBvblBhc3RlX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghZS5jbGlwYm9hcmREYXRhLmdldERhdGEpIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2xlYW5EYXRhID0gdXRpbC5jbGVhbkhUTUwoZS5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChjbGVhbkRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBjbGVhbkRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgIC8qKiB0b29sYmFyIGV2ZW50ICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5vbk1vdXNlRG93bl90b29sYmFyLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfdG9vbGJhciwgZmFsc2UpO1xyXG4gICAgLyoqIGVkaXRvciBhcmVhICovXHJcbiAgICBjb250ZXh0LmVsZW1lbnQucmVsYXRpdmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlZGl0b3IuZm9jdXMuYmluZChlZGl0b3IpLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgZXZlbnQub25Nb3VzZVVwX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQub25DbGlja193eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZXZlbnQub25LZXlEb3duX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnQub25LZXlVcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgZXZlbnQub25Ecm9wX3d5c2l3eWcsIGZhbHNlKTtcclxuICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgZXZlbnQub25QYXN0ZV93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBcclxuICAgIC8qKiBjb2RlIHZpZXcgYXJlYSBhdXRvIGxpbmUgKi9cclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudC5fY29kZVZpZXdBdXRvU2Nyb2xsLCBmYWxzZSk7XHJcblxyXG4gICAgLyoqIHJlc2l6aW5nQmFyICovXHJcbiAgICBpZiAoY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyKSB7XHJcbiAgICAgICAgaWYgKC9cXGQrLy50ZXN0KGNvbnRleHQub3B0aW9uLmhlaWdodCkpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGV2ZW50Lm9uTW91c2VEb3duX3Jlc2l6aW5nQmFyLCBmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhjb250ZXh0LmVsZW1lbnQucmVzaXppbmdCYXIsICdub25lLXJlc2l6ZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogaW5saW5lIGVkaXRvciAqL1xyXG4gICAgaWYgKGVkaXRvci5faXNJbmxpbmUpIHtcclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGV2ZW50Ll9zaG93VG9vbGJhcklubGluZSwgZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChlZGl0b3IuX2lzSW5saW5lIHx8IGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIGV2ZW50Ll9oaWRlVG9vbGJhciwgZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKiogd2luZG93IGV2ZW50ICovXHJcbiAgICBfdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBldmVudC5vblJlc2l6ZV93aW5kb3csIGZhbHNlKTtcclxuICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyID4gLTEpIF93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdywgZmFsc2UpO1xyXG5cclxuICAgIC8qKiBhZGQgcGx1Z2luIHRvIHBsdWdpbnMgb2JqZWN0ICovXHJcbiAgICBpZiAocGx1Z2lucykge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHBsdWdpbnMpLm1hcChmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnNba2V5XTtcclxuICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnNbcGx1Z2luLm5hbWVdID0gdXRpbC5jb3B5T2JqKHBsdWdpbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZXIgZnVuY3Rpb24gKi9cclxuICAgIGNvbnN0IHVzZXJGdW5jdGlvbiA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZnVuY3Rpb25zXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gRXZlbnQgT2JqZWN0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb25TY3JvbGw6IG51bGwsXHJcbiAgICAgICAgb25DbGljazogbnVsbCxcclxuICAgICAgICBvbktleURvd246IG51bGwsXHJcbiAgICAgICAgb25LZXlVcDogbnVsbCxcclxuICAgICAgICBvbkRyb3A6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDYWxsZWQgd2hlbiB0aGUgaW1hZ2UgaXMgdXBsb2FkZWQgb3IgdGhlIHVwbG9hZGVkIGltYWdlIGlzIGRlbGV0ZWRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldEltZ0VsZW1lbnQgLSBDdXJyZW50IGltZyBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gVXBsb2FkZWQgaW5kZXhcclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzRGVsZXRlIC0gV2hldGhlciBvciBub3QgaXQgd2FzIGNhbGxlZCBhZnRlciB0aGUgZGVsZXRlIG9wZXJhdGlvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uSW1hZ2VVcGxvYWQ6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIGEgbm90aWNlIGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSAtIE5vdGljZSBtZXNzYWdlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbm90aWNlT3BlbjogZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgZWRpdG9yLmFkZE1vZHVsZShbbm90aWNlXSk7XHJcbiAgICAgICAgICAgIG5vdGljZS5vcGVuLmNhbGwoZWRpdG9yLCBtZXNzYWdlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2xvc2UgYSBub3RpY2UgYXJlYVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vdGljZUNsb3NlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5hZGRNb2R1bGUoW25vdGljZV0pO1xyXG4gICAgICAgICAgICBub3RpY2UuY2xvc2UuY2FsbChlZGl0b3IpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yIHRvIHRoZSBvcmlnaW5hbCB0ZXh0YXJlYVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNhdmU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lm9yaWdpbkVsZW1lbnQudmFsdWUgPSBlZGl0b3IuZ2V0Q29udGVudHMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgc3VuZWRpdG9yJ3MgY29udGV4dCBvYmplY3QuIENvbnRhaW5zIHNldHRpbmdzLCBwbHVnaW5zLCBhbmQgY2FjaGVkIGVsZW1lbnQgb2JqZWN0c1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0Q29udGV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY29udGVudHMgb2YgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0Q29udGVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVkaXRvci5nZXRDb250ZW50cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXRzIHVwbG9hZGVkIGltYWdlcyBpbmZvcm1hdGlvbnNcclxuICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0SW1hZ2VzSW5mbzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZWRpdG9yLl92YXJpYWJsZS5faW1hZ2VzSW5mbztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyBhbiBIVE1MIGVsZW1lbnQgb3IgSFRNTCBzdHJpbmcgb3IgcGxhaW4gc3RyaW5nIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudHxTdHJpbmd9IGh0bWwgLSBIVE1MIEVsZW1lbnQgb3IgSFRNTCBzdHJpbmcgb3IgcGxhaW4gc3RyaW5nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaW5zZXJ0SFRNTDogZnVuY3Rpb24gKGh0bWwpIHtcclxuICAgICAgICAgICAgaWYgKCFodG1sLm5vZGVUeXBlIHx8IGh0bWwubm9kZVR5cGUgIT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdXRpbC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICAgICAgICAgIGh0bWwgPSB0ZW1wbGF0ZS5maXJzdENoaWxkIHx8IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWRpdG9yLmluc2VydE5vZGUoaHRtbCk7XHJcbiAgICAgICAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBDaGFuZ2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgLSBDb250ZW50cyB0byBJbnB1dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNldENvbnRlbnRzOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MID0gdXRpbC5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29udGVudHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUudmFsdWUgPSBjb250ZW50cztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgY29udGVudHMgdG8gdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb250ZW50cyAtIENvbnRlbnRzIHRvIElucHV0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYXBwZW5kQ29udGVudHM6IGZ1bmN0aW9uIChjb250ZW50cykge1xyXG4gICAgICAgICAgICBpZiAoZWRpdG9yLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwgKz0gdXRpbC5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29udGVudHMpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUudmFsdWUgKz0gY29udGVudHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGlzYWJsZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGlzYWJsZWQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC50b29sLmNvdmVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIGZhbHNlKTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbmFibGVkIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBlbmFibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQudG9vbC5jb3Zlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsIHRydWUpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFNob3cgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgdG9wQXJlYVN0eWxlID0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGU7XHJcbiAgICAgICAgICAgIGlmICh0b3BBcmVhU3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB0b3BBcmVhU3R5bGUuZGlzcGxheSA9IGNvbnRleHQub3B0aW9uLmRpc3BsYXk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEhpZGUgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvcEFyZWEuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRGVzdHJveSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAvKiogcmVtb3ZlIHdpbmRvdyBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgICAgICAgICAgX3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZXZlbnQub25SZXNpemVfd2luZG93KTtcclxuICAgICAgICAgICAgX3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZXZlbnQub25TY3JvbGxfd2luZG93KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8qKiByZW1vdmUgZWxlbWVudCAqL1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oY29udGV4dC5lbGVtZW50LnRvcEFyZWEpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5vblNjcm9sbCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25DbGljayA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25LZXlEb3duID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbktleVVwID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbkRyb3AgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uSW1hZ2VVcGxvYWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGljZU9wZW4gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm5vdGljZUNsb3NlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250ZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250ZW50cyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW1hZ2VzSW5mbyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SFRNTCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGVuZENvbnRlbnRzID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuaGlkZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBjb250ZXh0ID0gbnVsbDtcclxuICAgICAgICAgICAgcGx1Z2lucyA9IG51bGw7XHJcbiAgICAgICAgICAgIGxhbmcgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHVzZXJGdW5jdGlvbjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNvcmU7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBSUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQUNBO0FBV0E7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBakJBO0FBQ0E7QUFtQkE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFoREE7QUFDQTtBQWtEQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdrREE7QUFnbERBOzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQVdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlEQTtBQUNBO0FBZ0VBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFwa0JBO0FBdWtCQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUE5S0E7QUFpTEE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/core.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./src/lib/util.js\");\n/* harmony import */ var _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../plugins/modules/notice */ \"./src/plugins/modules/notice.js\");\n/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\n\n\n\n\n/**\r\n * @description SunEditor core closure\r\n * @param context\r\n * @param plugins\r\n * @param lang\r\n * @returns {{save: save, getContext: getContext, getContent: getContent, setContent: setContent, appendContent: appendContent, disabled: disabled, enabled: enabled, show: show, hide: hide, destroy: destroy}}\r\n */\n\nconst core = function (context, plugins, lang) {\n const _d = document;\n const _w = window;\n /**\r\n * @description editor core object\r\n * should always bind this object when registering an event in the plug-in.\r\n */\n\n const editor = {\n /**\r\n * @description Elements and user options parameters of the suneditor\r\n */\n context: context,\n\n /**\r\n * @description loaded plugins\r\n */\n plugins: {},\n\n /**\r\n * @description Whether the plugin is initialized\r\n */\n initPlugins: {},\n\n /**\r\n * @description loaded language\r\n */\n lang: lang,\n\n /**\r\n * @description dialog element\r\n */\n dialogForm: null,\n\n /**\r\n * @description current subment name\r\n * @private\r\n */\n _submenuName: '',\n\n /**\r\n * @description submenu element\r\n */\n submenu: null,\n\n /**\r\n * @description binded submenuOff method\r\n * @private\r\n */\n _bindedSubmenuOff: null,\n\n /**\r\n * @description active button element in submenu\r\n */\n submenuActiveButton: null,\n\n /**\r\n * @description The elements array to be processed unvisible when the controllersOff function is executed (resizing, link modified button, table controller)\r\n */\n controllerArray: [],\n\n /**\r\n * @description binded controllersOff method\r\n * @private\r\n */\n _bindControllersOff: null,\n\n /**\r\n * @description An array of buttons whose class name is not \"code-view-enabled\"\r\n */\n codeViewDisabledButtons: context.element.toolbar.querySelectorAll('.sun-editor-id-toolbar button:not([class~=\"code-view-enabled\"])'),\n\n /**\r\n * @description Is inline mode?\r\n * @private\r\n */\n _isInline: /inline/i.test(context.option.mode),\n\n /**\r\n * @description Is balloon mode?\r\n * @private\r\n */\n _isBalloon: /balloon/i.test(context.option.mode),\n\n /**\r\n * @description Required value when using inline mode to sticky toolbar\r\n * @private\r\n */\n _inlineToolbarAttr: {\n width: 0,\n height: 0,\n isShow: false\n },\n\n /**\r\n * @description An user event function when image uploaded success or remove image\r\n * @private\r\n */\n _imageUpload: function (targetImgElement, index, isDelete) {\n if (userFunction.onImageUpload) userFunction.onImageUpload(targetImgElement, index, isDelete);\n },\n\n /**\r\n * @description Elements that need to change text or className for each selection change\r\n * @property {Element} FORMAT - format button\r\n * @property {Element} FONT - font family button\r\n * @property {Element} SIZE - font size button\r\n * @property {Element} B - bold button\r\n * @property {Element} U - underline button\r\n * @property {Element} I - italic button\r\n * @property {Element} STRIKE - strike button\r\n * @property {Element} SUB - subscript button\r\n * @property {Element} SUP - superscript button\r\n */\n commandMap: {\n FORMAT: context.tool.format,\n FONT: context.tool.font,\n SIZE: context.tool.fontSize,\n B: context.tool.bold,\n U: context.tool.underline,\n I: context.tool.italic,\n STRIKE: context.tool.strike,\n SUB: context.tool.subscript,\n SUP: context.tool.superscript\n },\n\n /**\r\n * @description Variables used internally in editor operation\r\n * @property {Boolean} wysiwygActive - The wysiwyg frame or code view state\r\n * @property {Boolean} isFullScreen - State of full screen\r\n * @property {Number} innerHeight_fullScreen - InnerHeight in editor when in full screen\r\n * @property {Number} resizeClientY - Remember the vertical size of the editor before resizing the editor (Used when calculating during resize operation)\r\n * @property {Number} tabSize - Indented size when tab button clicked (4)\r\n * @property {Number} minResizingSize - Minimum size of editing area when resized (65)\r\n * @property {Array} currentNodes - An array of the current cursor's node structure\r\n * @private\r\n */\n _variable: {\n wysiwygActive: true,\n isFullScreen: false,\n innerHeight_fullScreen: 0,\n resizeClientY: 0,\n tabSize: 4,\n minResizingSize: 65,\n currentNodes: [],\n _range: null,\n _selectionNode: null,\n _originCssText: context.element.topArea.style.cssText,\n _bodyOverflow: '',\n _editorAreaOriginCssText: '',\n _wysiwygOriginCssText: '',\n _codeOriginCssText: '',\n _sticky: false,\n _imagesInfo: [],\n _imageIndex: 0\n },\n\n /**\r\n * @description If the plugin is not added, add the plugin and call the 'add' function.\r\n * If the plugin is added call callBack function.\r\n * @param {String} pluginName - The name of the plugin to call\r\n * @param {function} callBackFunction - Function to be executed immediately after module call\r\n */\n callPlugin: function (pluginName, callBackFunction) {\n if (!this.plugins[pluginName]) {\n throw Error('[SUNEDITOR.core.callPlugin.fail] The called plugin does not exist or is in an invalid format. (pluginName:\"' + pluginName + '\")');\n } else if (!this.initPlugins[pluginName]) {\n this.plugins[pluginName].add(this, this.plugins[pluginName].buttonElement);\n this.initPlugins[pluginName] = true;\n }\n\n callBackFunction();\n },\n\n /**\r\n * @description If the module is not added, add the module and call the 'add' function\r\n * @param {Array} moduleArray - module object's Array [dialog, resizing]\r\n */\n addModule: function (moduleArray) {\n let moduleName = '';\n\n for (let i = 0, len = moduleArray.length; i < len; i++) {\n moduleName = moduleArray[i].name;\n\n if (!this.plugins[moduleName]) {\n this.plugins[moduleName] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(moduleArray[i]);\n this.plugins[moduleName].add(this);\n }\n }\n },\n\n /**\r\n * @description Enabled submenu\r\n * @param {Element} element - Submenu element to call\r\n */\n submenuOn: function (element) {\n const submenuName = this._submenuName = element.getAttribute('data-command');\n if (this.plugins[submenuName].on) this.plugins[submenuName].on.call(this);\n this.submenu = element.nextElementSibling;\n this.submenu.style.display = 'block';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element, 'on');\n this.submenuActiveButton = element;\n const overLeft = this.context.element.toolbar.offsetWidth - (element.parentElement.offsetLeft + this.submenu.offsetWidth);\n if (overLeft < 0) this.submenu.style.left = overLeft + 'px';else this.submenu.style.left = '1px';\n this._bindedSubmenuOff = this.submenuOff.bind(this);\n\n _d.addEventListener('mousedown', this._bindedSubmenuOff, false);\n },\n\n /**\r\n * @description Disable submenu\r\n */\n submenuOff: function () {\n if (this.submenu) {\n this._submenuName = '';\n this.submenu.style.display = 'none';\n this.submenu = null;\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(this.submenuActiveButton, 'on');\n this.submenuActiveButton = null;\n\n _d.removeEventListener('mousedown', this._bindedSubmenuOff);\n }\n\n this.controllersOff();\n },\n\n /**\r\n * @description Disable controller in editor area (link button, image resize button)\r\n */\n controllersOn: function () {\n for (let i = 0; i < arguments.length; i++) {\n arguments[i].style.display = 'block';\n this.controllerArray[i] = arguments[i];\n }\n\n this._bindControllersOff = this.controllersOff.bind(this);\n\n _d.addEventListener('mousedown', this._bindControllersOff, false);\n },\n\n /**\r\n * @description Disable controller in editor area (link button, image resize button)\r\n */\n controllersOff: function () {\n const len = this.controllerArray.length;\n\n if (len > 0) {\n for (let i = 0; i < len; i++) {\n this.controllerArray[i].style.display = 'none';\n }\n\n this.controllerArray = [];\n\n _d.removeEventListener('mousedown', this._bindControllersOff);\n }\n },\n\n /**\r\n * @description javascript execCommand\r\n * @param {String} command - javascript execCommand function property\r\n * @param {Boolean} showDefaultUI - javascript execCommand function property\r\n * @param {String} value - javascript execCommand function property\r\n */\n execCommand: function (command, showDefaultUI, value) {\n _d.execCommand(command, showDefaultUI, command === 'formatBlock' ? '<' + value + '>' : value);\n },\n\n /**\r\n * @description Focus to wysiwyg area\r\n */\n focus: function () {\n if (context.element.wysiwyg.style.display === 'none') return;\n const caption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(this.getSelectionNode(), 'figcaption');\n\n if (caption) {\n caption.focus();\n } else {\n context.element.wysiwyg.focus();\n }\n\n event._findButtonEffectTag();\n },\n\n /**\r\n * @description Set current editor's range object\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Element} endOff - The endOffset property of the selection object.\r\n */\n setRange: function (startCon, startOff, endCon, endOff) {\n const range = _d.createRange();\n\n range.setStart(startCon, startOff);\n range.setEnd(endCon, endOff);\n\n const selection = _w.getSelection();\n\n if (selection.removeAllRanges) {\n selection.removeAllRanges();\n }\n\n selection.addRange(range);\n\n this._editorRange();\n },\n\n /**\r\n * @description Get current editor's range object\r\n * @returns {Object}\r\n */\n getRange: function () {\n return this._variable._range || this._createDefaultRange();\n },\n\n /**\r\n * @description Get current select node\r\n * @returns {Node}\r\n */\n getSelectionNode: function () {\n return this._variable._selectionNode || context.element.wysiwyg.firstChild;\n },\n\n /**\r\n * @description Saving the range object and the currently selected node of editor\r\n * @private\r\n */\n _editorRange: function () {\n const selection = _w.getSelection();\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(selection.focusNode, '.sun-editor-id-wysiwyg')) return;\n let range = null;\n let selectionNode = null;\n\n if (selection.rangeCount > 0) {\n range = selection.getRangeAt(0);\n } else {\n range = this._createDefaultRange();\n }\n\n this._variable._range = range;\n\n if (range.collapsed) {\n selectionNode = range.commonAncestorContainer;\n } else {\n selectionNode = selection.extentNode || selection.anchorNode;\n }\n\n this._variable._selectionNode = selectionNode;\n },\n\n /**\r\n * @description Return the range object of editor's first child node\r\n * @returns {Object}\r\n * @private\r\n */\n _createDefaultRange: function () {\n const range = _d.createRange();\n\n range.setStart(context.element.wysiwyg.firstChild, 0);\n range.setEnd(context.element.wysiwyg.firstChild, 0);\n return range;\n },\n\n /**\r\n * @description Returns a \"formatElement\"(P, DIV, H[1-6], LI) array from the currently selected range.\r\n * @returns {Array}\r\n */\n getSelectedFormatElements: function () {\n let range = this.getRange();\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer)) {\n const children = context.element.wysiwyg.children;\n this.setRange(children[0], 0, children[children.length - 1], children[children.length - 1].textContent.length);\n range = this.getRange();\n }\n\n const startCon = range.startContainer;\n const endCon = range.endContainer;\n const commonCon = range.commonAncestorContainer;\n const rangeFormatElements = [];\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) return [_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(commonCon)]; // get line nodes\n\n const lineNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(commonCon, function (current) {\n return _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(current);\n });\n if (startCon === endCon) return lineNodes[0];\n let startLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(startCon);\n let endLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(endCon);\n let startIdx = 0;\n let endIdx = 0;\n\n for (let i = 0, len = lineNodes.length; i < len; i++) {\n if (startLine === lineNodes[i]) {\n startIdx = i;\n continue;\n }\n\n if (endLine === lineNodes[i]) {\n endIdx = i;\n break;\n }\n }\n\n for (let i = startIdx; i <= endIdx; i++) {\n rangeFormatElements.push(lineNodes[i]);\n }\n\n return rangeFormatElements;\n },\n\n /**\r\n * @description Returns a \"rangeFormatElement\"(blockquote, TABLE, TR, TD, OL, UL, PRE) array from the currently selected range.\r\n * @returns {Array}\r\n */\n getSelectedRangeFormatElements: function () {\n let range = this.getRange();\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer)) {\n const children = context.element.wysiwyg.children;\n this.setRange(children[0], 0, children[children.length - 1], children[children.length - 1].textContent.length);\n range = this.getRange();\n }\n\n const startCon = range.startContainer;\n const endCon = range.endContainer;\n const commonCon = range.commonAncestorContainer;\n const rangeFormatElements = [];\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) return [commonCon];\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon)) {\n const el = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(commonCon);\n return el ? [el] : [];\n } // get range Elements\n\n\n const rangeElements = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(commonCon, function (current) {\n return _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(current);\n });\n if (startCon === endCon) return rangeElements[0];\n let startLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(startCon);\n let endLine = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(endCon);\n let startIdx = 0;\n let endIdx = 0;\n\n for (let i = 0, len = rangeElements.length; i < len; i++) {\n if (startLine === rangeElements[i]) {\n startIdx = i;\n continue;\n }\n\n if (endLine === rangeElements[i]) {\n endIdx = i;\n break;\n }\n }\n\n for (let i = startIdx; i <= endIdx; i++) {\n if (rangeElements[i]) rangeFormatElements.push(rangeElements[i]);\n }\n\n return rangeFormatElements;\n },\n\n /**\r\n * @description Determine if this offset is the edge offset of container\r\n * @param {Object} container - The container property of the selection object.\r\n * @param {Number} offset - The offset property of the selection object.\r\n * @returns {Boolean}\r\n */\n isEdgePoint: function (container, offset) {\n return offset === 0 || offset === container.nodeValue.length;\n },\n\n /**\r\n * @description Show loading box\r\n */\n showLoading: function () {\n context.element.loading.style.display = 'block';\n },\n\n /**\r\n * @description Close loading box\r\n */\n closeLoading: function () {\n context.element.loading.style.display = 'none';\n },\n\n /**\r\n * @description Append format element to sibling node of argument element.\r\n * If the \"formatNodeName\" argument value is present, the tag of that argument value is inserted,\r\n * If not, the currently selected format tag is inserted.\r\n * @param {Element} element - Insert as siblings of that element\r\n * @param {String|null} formatNodeName - Node name to be inserted\r\n * @returns {Element}\r\n */\n appendFormatTag: function (element, formatNodeName) {\n const formatEl = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(element) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(element);\n const currentFormatEl = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(this.getSelectionNode());\n const oFormatName = formatNodeName ? formatNodeName : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(currentFormatEl) ? currentFormatEl.nodeName : 'P';\n const oFormat = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(oFormatName);\n oFormat.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(formatEl)) formatEl.insertBefore(oFormat, element.nextElementSibling);else formatEl.parentNode.insertBefore(oFormat, formatEl.nextElementSibling);\n return oFormat;\n },\n\n /**\r\n * @description Delete selected node and insert argument value node\r\n * @param {Element} oNode - Node to be inserted\r\n * @param {(Element|null)} rightNode - If the node exists, it is inserted after the node\r\n */\n insertNode: function (oNode, rightNode) {\n const range = this.getRange();\n let parentNode = null;\n\n if (!rightNode) {\n const startCon = range.startContainer;\n const startOff = range.startOffset;\n const endCon = range.endContainer;\n const endOff = range.endOffset;\n const commonCon = range.commonAncestorContainer;\n parentNode = startCon;\n\n if (startCon.nodeType === 3) {\n parentNode = startCon.parentNode;\n }\n /** No Select range node */\n\n\n if (range.collapsed) {\n if (commonCon.nodeType === 3) {\n rightNode = commonCon.splitText(endOff);\n } else {\n if (parentNode.lastChild !== null && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(parentNode.lastChild)) {\n parentNode.removeChild(parentNode.lastChild);\n }\n\n rightNode = null;\n }\n }\n /** Select range nodes */\n else {\n const isSameContainer = startCon === endCon;\n\n if (isSameContainer) {\n if (this.isEdgePoint(endCon, endOff)) rightNode = endCon.nextSibling;else rightNode = endCon.splitText(endOff);\n let removeNode = startCon;\n if (!this.isEdgePoint(startCon, startOff)) removeNode = startCon.splitText(startOff);\n parentNode.removeChild(removeNode);\n } else {\n this.removeNode();\n parentNode = commonCon;\n rightNode = endCon;\n\n while (rightNode.parentNode !== commonCon) {\n rightNode = rightNode.parentNode;\n }\n }\n }\n } else {\n parentNode = rightNode.parentNode;\n rightNode = rightNode.nextSibling;\n }\n\n try {\n parentNode.insertBefore(oNode, rightNode);\n } catch (e) {\n parentNode.appendChild(oNode);\n }\n },\n\n /**\r\n * @description Delete the currently selected node\r\n */\n removeNode: function () {\n const range = this.getRange();\n\n if (range.deleteContents) {\n range.deleteContents();\n return;\n }\n\n const startCon = range.startContainer;\n const startOff = range.startOffset;\n const endCon = range.endContainer;\n const endOff = range.endOffset;\n const commonCon = range.commonAncestorContainer;\n let beforeNode = null;\n let afterNode = null;\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(commonCon);\n let startIndex = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, startCon);\n let endIndex = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, endCon);\n\n for (let i = startIndex + 1, startNode = startCon; i >= 0; i--) {\n if (childNodes[i] === startNode.parentNode && childNodes[i].firstChild === startNode && startOff === 0) {\n startIndex = i;\n startNode = startNode.parentNode;\n }\n }\n\n for (let i = endIndex - 1, endNode = endCon; i > startIndex; i--) {\n if (childNodes[i] === endNode.parentNode && childNodes[i].nodeType === 1) {\n childNodes.splice(i, 1);\n endNode = endNode.parentNode;\n --endIndex;\n }\n }\n\n for (let i = startIndex; i <= endIndex; i++) {\n const item = childNodes[i];\n\n if (item.length === 0 || item.nodeType === 3 && item.data === undefined) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(item);\n continue;\n }\n\n if (item === startCon) {\n if (startCon.nodeType === 1) {\n beforeNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startCon.textContent);\n } else {\n beforeNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startCon.substringData(0, startOff));\n }\n\n if (beforeNode.length > 0) {\n startCon.data = beforeNode.data;\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(startCon);\n }\n\n continue;\n }\n\n if (item === endCon) {\n if (endCon.nodeType === 1) {\n afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endCon.textContent);\n } else {\n afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endCon.substringData(endOff, endCon.length - endOff));\n }\n\n if (afterNode.length > 0) {\n endCon.data = afterNode.data;\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(endCon);\n }\n\n continue;\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(item);\n }\n },\n\n /**\r\n * @description appended all selected format Element to the argument element and insert\r\n * @param {Element} wrapTag - Element of wrap the arguments\r\n */\n wrapToTags: function (wrapTag) {\n const range = this.getRange();\n const rangeLines = this.getSelectedFormatElements();\n\n if (!rangeLines) {\n const inner = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(this.getSelectionNode()) ? 'DIV' : 'P');\n inner.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n wrapTag.appendChild(inner);\n this.getSelectionNode().appendChild(wrapTag);\n return;\n }\n\n let last = rangeLines[rangeLines.length - 1];\n let standTag, beforeTag, pElement;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(last) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(last)) {\n standTag = last;\n } else {\n standTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getRangeFormatElement(last) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(last);\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(standTag)) {\n beforeTag = null;\n pElement = standTag;\n } else {\n beforeTag = standTag.nextSibling;\n pElement = standTag.parentNode;\n }\n\n let listParent = null;\n let line = null;\n let prevNodeName = '';\n\n for (let i = 0, len = rangeLines.length; i < len; i++) {\n line = rangeLines[i];\n\n if (/^LI$/i.test(line.nodeName)) {\n if (listParent === null || !/^LI$/i.test(prevNodeName)) {\n listParent = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(line.parentNode.nodeName);\n }\n\n listParent.appendChild(line);\n if (i === len - 1 || !/^LI$/i.test(rangeLines[i + 1].nodeName)) wrapTag.appendChild(listParent);\n } else {\n wrapTag.appendChild(line);\n }\n\n prevNodeName = line.nodeName;\n }\n\n pElement.insertBefore(wrapTag, beforeTag);\n if (!range.collapsed && (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(range.startContainer) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(range.endContainer))) _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pElement);\n },\n\n /**\r\n * @description Add the node received as an argument value to the selected area.\r\n * 1. When there is the same css value node in the selection area, the tag is stripped.\r\n * 2. If there is another css value other thanCss attribute values received as arguments on the node, removed only Css attribute values received as arguments\r\n * 3. If you pass an element whose node name is \"removenode\" as an argument value, it performs a type removal operation. ex) nodeChange(document.createElement('removenode'))\r\n * @param {Element} appendNode - The dom that will wrap the selected text area\r\n * @param {Array} checkCSSPropertyArray - The css attribute name Array to check (['font-size'], ['font-family', 'background-color', 'border']...])\r\n */\n nodeChange: function (appendNode, checkCSSPropertyArray) {\n const range = this.getRange();\n const isRemoveFormat = /removenode/i.test(appendNode.nodeName);\n let tempCon, tempOffset, tempChild, tempArray;\n /* checked same style property */\n\n if (range.startContainer === range.endContainer) {\n let sNode = range.startContainer;\n\n if (isRemoveFormat) {\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(sNode) === sNode.parentNode) return;\n } else {\n let checkCnt = 0;\n\n for (let i = 0; i < checkCSSPropertyArray.length; i++) {\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(sNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(sNode)) {\n if (sNode.nodeType === 1 && sNode.style[checkCSSPropertyArray[i]] === appendNode.style[checkCSSPropertyArray[i]]) {\n checkCnt++;\n }\n\n sNode = sNode.parentNode;\n }\n }\n\n if (checkCnt >= checkCSSPropertyArray.length) return;\n }\n }\n /* find text node */\n // startContainer\n\n\n tempCon = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.startContainer) ? context.element.wysiwyg.firstChild : range.startContainer;\n tempOffset = range.startOffset;\n\n if (tempCon.nodeType === 1 && tempCon.childNodes.length > 0) {\n while (tempCon && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon) && tempCon.nodeType === 1) {\n tempArray = [];\n tempChild = tempCon.childNodes;\n\n for (let i = 0, len = tempChild.length; i < len; i++) {\n tempArray.push(tempChild[i]);\n }\n\n tempCon = tempArray[tempOffset] || tempCon.nextElementSibling || tempCon.nextSibling;\n tempOffset = 0;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon)) {\n const emptyText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n tempCon.parentNode.insertBefore(emptyText, tempCon);\n tempCon = emptyText;\n }\n }\n\n const startCon = tempCon;\n const startOff = tempOffset; // endContainer\n\n tempCon = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(range.endContainer) ? context.element.wysiwyg.lastChild : range.endContainer;\n tempOffset = range.endOffset;\n\n if (tempCon.nodeType === 1 && tempCon.childNodes.length > 0) {\n while (tempCon && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon) && tempCon.nodeType === 1) {\n tempArray = [];\n tempChild = tempCon.childNodes;\n\n for (let i = 0, len = tempChild.length; i < len; i++) {\n tempArray.push(tempChild[i]);\n }\n\n tempCon = tempArray[tempOffset - 1] || !/FIGURE/i.test(tempArray[0].nodeName) ? tempArray[0] : tempCon.previousElementSibling || tempCon.previousSibling || startCon;\n }\n\n tempOffset = tempCon.textContent.length;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(tempCon)) {\n const emptyText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n tempCon.parentNode.insertBefore(emptyText, tempCon);\n tempCon = emptyText;\n tempOffset = 0;\n }\n }\n\n const endCon = tempCon;\n const endOff = tempOffset;\n const commonCon = range.commonAncestorContainer;\n const newNodeName = appendNode.nodeName;\n this.setRange(startCon, startOff, endCon, endOff);\n let start = {},\n end = {};\n let newNode, regExp;\n\n if (checkCSSPropertyArray) {\n regExp = '(?:;|^|\\\\s)(?:' + checkCSSPropertyArray[0];\n\n for (let i = 1; i < checkCSSPropertyArray.length; i++) {\n regExp += '|' + checkCSSPropertyArray[i];\n }\n\n regExp += ')\\\\s*:[^;]*\\\\s*(?:;|$)';\n regExp = new RegExp(regExp, 'ig');\n }\n /** tag check function*/\n\n\n const checkCss = function (vNode) {\n if (isRemoveFormat || vNode.nodeType === 3 || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(vNode)) return true;\n let style = '';\n\n if (regExp && vNode.style.cssText.length > 0) {\n style = vNode.style.cssText.replace(regExp, '').trim();\n }\n\n if (style.length > 0 || vNode.nodeName !== newNodeName) {\n if (vNode.style.cssText.length > 0) vNode.style.cssText = style;\n return true;\n }\n\n return false;\n };\n /** one line */\n\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(commonCon) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(commonCon)) {\n newNode = appendNode.cloneNode(false);\n\n const newRange = this._nodeChange_oneLine(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(commonCon), newNode, checkCss, startCon, startOff, endCon, endOff, isRemoveFormat, range.collapsed);\n\n start.container = newRange.startContainer;\n start.offset = newRange.startOffset;\n end.container = newRange.endContainer;\n end.offset = newRange.endOffset;\n }\n /** multi line */\n else {\n // get line nodes\n const lineNodes = this.getSelectedFormatElements();\n const endLength = lineNodes.length - 1; // startCon\n\n newNode = appendNode.cloneNode(false);\n start = this._nodeChange_startLine(lineNodes[0], newNode, checkCss, startCon, startOff, isRemoveFormat); // mid\n\n for (let i = 1; i < endLength; i++) {\n newNode = appendNode.cloneNode(false);\n\n this._nodeChange_middleLine(lineNodes[i], newNode, checkCss, isRemoveFormat);\n } // endCon\n\n\n if (endLength > 0) {\n newNode = appendNode.cloneNode(false);\n end = this._nodeChange_endLine(lineNodes[endLength], newNode, checkCss, endCon, endOff, isRemoveFormat);\n } else {\n end = start;\n }\n } // set range\n\n\n this.setRange(start.container, start.offset, end.container, end.offset);\n },\n\n /**\r\n * @description wraps text nodes of line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Number} endOff - The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @param {Boolean} collapsed - range.collapsed\r\n * @returns {{startContainer: *, startOffset: *, endContainer: *, endOffset: *}}\r\n * @private\r\n */\n _nodeChange_oneLine: function (element, newInnerNode, validation, startCon, startOff, endCon, endOff, isRemoveFormat, collapsed) {\n const el = element;\n const pNode = element.cloneNode(false);\n const isSameNode = startCon === endCon;\n let startContainer = startCon;\n let startOffset = startOff;\n let endContainer = endCon;\n let endOffset = endOff;\n let startPass = false;\n let endPass = false;\n let pCurrent, newNode, appendNode, cssText;\n\n function checkCss(vNode) {\n const regExp = new RegExp('(?:;|^|\\\\s)(?:' + cssText + 'null)\\\\s*:[^;]*\\\\s*(?:;|$)', 'ig');\n let style = '';\n\n if (regExp && vNode.style.cssText.length > 0) {\n style = regExp.test(vNode.style.cssText);\n }\n\n return !style;\n }\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n let child = childNodes[i];\n let coverNode = node;\n let cloneNode; // startContainer\n\n if (!startPass && child === startContainer) {\n const prevNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(0, startOffset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(startContainer.nodeType === 1 ? '' : startContainer.substringData(startOffset, endOffset > startOffset ? endOffset - startOffset : startOffset - endOffset));\n\n if (prevNode.data.length > 0) {\n node.appendChild(prevNode);\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || textNode;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n pNode.appendChild(newInnerNode);\n startContainer = textNode;\n startOffset = 0;\n startPass = true;\n if (newNode !== textNode) newNode.appendChild(startContainer);\n if (!isSameNode) continue;\n } // endContainer\n\n\n if (!endPass && child === endContainer) {\n const afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(endContainer.nodeType === 1 ? '' : endContainer.substringData(endOffset, endContainer.length - endOffset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(isSameNode || endContainer.nodeType === 1 ? '' : endContainer.substringData(0, endOffset));\n\n if (afterNode.data.length > 0) {\n newNode = child;\n cssText = '';\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n cloneNode = appendNode = newNode = pCurrent.pop() || afterNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n pNode.appendChild(cloneNode);\n newNode.textContent = afterNode.data;\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode !== pNode && newNode !== el && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1 && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || textNode;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n endContainer = textNode;\n endOffset = textNode.data.length;\n endPass = true;\n\n if (!isRemoveFormat && collapsed) {\n newInnerNode = textNode;\n textNode.textContent = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n }\n\n if (newNode !== textNode) newNode.appendChild(endContainer);\n continue;\n } // other\n\n\n if (startPass) {\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n cssText = '';\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (newNode.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child) && (endPass || validation(newNode)) && checkCss(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n cssText += newNode.style.cssText.substr(0, newNode.style.cssText.indexOf(':')) + '|';\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || child;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode === child) {\n if (!endPass) node = newInnerNode;else node = pNode;\n } else if (endPass) {\n pNode.appendChild(childNode);\n node = newNode;\n } else {\n newInnerNode.appendChild(childNode);\n node = newNode;\n }\n }\n\n cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n startContainer = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(collapsed ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace : newInnerNode.textContent);\n pNode.insertBefore(startContainer, newInnerNode);\n pNode.removeChild(newInnerNode);\n if (collapsed) startOffset = 1;\n } else if (collapsed) {\n startContainer = endContainer = newInnerNode;\n startOffset = 1;\n endOffset = 1;\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n return {\n startContainer: startContainer,\n startOffset: startOffset,\n endContainer: isRemoveFormat || !endContainer.textContent ? startContainer : endContainer,\n endOffset: isRemoveFormat || !endContainer.textContent ? startContainer.textContent.length : endOffset\n };\n },\n\n /**\r\n * @description wraps mid lines selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @private\r\n */\n _nodeChange_middleLine: function (element, newInnerNode, validation, isRemoveFormat) {\n if (isRemoveFormat) {\n newInnerNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(element.textContent ? element.textContent : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n } else {\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n let child = childNodes[i];\n let coverNode = node;\n\n if (validation(child)) {\n let cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, newInnerNode);\n }\n\n element.innerHTML = '';\n element.appendChild(newInnerNode);\n },\n\n /**\r\n * @description wraps first line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} startCon - The startContainer property of the selection object.\r\n * @param {Number} startOff - The startOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @returns {{container: *, offset: *}}\r\n * @private\r\n */\n _nodeChange_startLine: function (element, newInnerNode, validation, startCon, startOff, isRemoveFormat) {\n const el = element;\n const pNode = element.cloneNode(false);\n let container = startCon;\n let offset = startOff;\n let passNode = false;\n let pCurrent, newNode, appendNode;\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = 0, len = childNodes.length; i < len; i++) {\n const child = childNodes[i];\n let coverNode = node;\n\n if (passNode && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n if (child.nodeType === 1) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (newNode.nodeType === 1 && validation(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n if (pCurrent.length > 0) {\n const childNode = pCurrent.pop();\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.appendChild(childNode);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n } // startContainer\n\n\n if (!passNode && child === container) {\n const prevNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, container.length - offset));\n\n if (prevNode.data.length > 0) {\n node.appendChild(prevNode);\n }\n\n newNode = node;\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== null) {\n if (newNode.nodeType === 1 && validation(newNode)) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || node;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode !== node) {\n newInnerNode.appendChild(childNode);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\n pNode.appendChild(newInnerNode);\n container = textNode;\n offset = 0;\n passNode = true;\n node.appendChild(container);\n continue;\n }\n\n if (!passNode || validation(child)) {\n const cloneNode = child.cloneNode(false);\n node.appendChild(cloneNode);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(newInnerNode.textContent);\n pNode.insertBefore(container, newInnerNode);\n pNode.removeChild(newInnerNode);\n }\n\n if (!isRemoveFormat && pNode.children.length === 0) {\n if (element.childNodes) {\n container = element.childNodes[0];\n } else {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n element.appendChild(container);\n }\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n }\n\n return {\n container: container,\n offset: offset\n };\n },\n\n /**\r\n * @description wraps last line selected text.\r\n * @param {Element} element - The node of the line that contains the selected text node.\r\n * @param {Element} newInnerNode - The dom that will wrap the selected text area\r\n * @param {function} validation - Check if the node should be stripped.\r\n * @param {Element} endCon - The endContainer property of the selection object.\r\n * @param {Number} endOff - The endOffset property of the selection object.\r\n * @param {Boolean} isRemoveFormat - Is the remove format command ?\r\n * @returns {{container: *, offset: *}}\r\n * @private\r\n */\n _nodeChange_endLine: function (element, newInnerNode, validation, endCon, endOff, isRemoveFormat) {\n const el = element;\n const pNode = element.cloneNode(false);\n let container = endCon;\n let offset = endOff;\n let passNode = false;\n let pCurrent, newNode, appendNode;\n\n (function recursionFunc(current, node) {\n const childNodes = current.childNodes;\n\n for (let i = childNodes.length - 1; 0 <= i; i--) {\n const child = childNodes[i];\n let coverNode = node;\n\n if (passNode && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) {\n if (child.nodeType === 1) {\n recursionFunc(child, child);\n continue;\n }\n\n newNode = child;\n pCurrent = [];\n\n while (newNode.parentNode !== null && newNode !== el && newNode !== newInnerNode) {\n if (validation(newNode) && newNode.nodeType === 1) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n if (pCurrent.length > 0) {\n const childNode = pCurrent.pop();\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n } // endContainer\n\n\n if (!passNode && child === container) {\n const afterNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(offset, container.length - offset));\n const textNode = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(container.nodeType === 1 ? '' : container.substringData(0, offset));\n\n if (afterNode.data.length > 0) {\n node.insertBefore(afterNode, node.firstChild);\n }\n\n newNode = node;\n pCurrent = [];\n\n while (newNode !== pNode && newNode !== null) {\n if (validation(newNode) && newNode.nodeType === 1) {\n pCurrent.push(newNode.cloneNode(false));\n }\n\n newNode = newNode.parentNode;\n }\n\n const childNode = pCurrent.pop() || node;\n appendNode = newNode = childNode;\n\n while (pCurrent.length > 0) {\n newNode = pCurrent.pop();\n appendNode.appendChild(newNode);\n appendNode = newNode;\n }\n\n if (childNode !== node) {\n newInnerNode.insertBefore(childNode, newInnerNode.firstChild);\n node = newNode;\n } else {\n node = newInnerNode;\n }\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) newInnerNode.appendChild(child.cloneNode(false));\n pNode.insertBefore(newInnerNode, pNode.firstChild);\n container = textNode;\n offset = textNode.data.length;\n passNode = true;\n node.insertBefore(container, node.firstChild);\n continue;\n }\n\n if (!passNode || validation(child)) {\n const cloneNode = child.cloneNode(false);\n node.insertBefore(cloneNode, node.firstChild);\n if (child.nodeType === 1 && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isBreak(child)) coverNode = cloneNode;\n }\n\n recursionFunc(child, coverNode);\n }\n })(element, pNode);\n\n if (isRemoveFormat) {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(newInnerNode.textContent);\n offset = container.textContent.length;\n pNode.insertBefore(container, newInnerNode);\n pNode.removeChild(newInnerNode);\n }\n\n if (!isRemoveFormat && pNode.childNodes.length === 0) {\n if (element.childNodes) {\n container = element.childNodes[0];\n } else {\n container = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace);\n element.appendChild(container);\n }\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeEmptyNode(pNode);\n element.parentNode.insertBefore(pNode, element);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(element);\n }\n\n return {\n container: container,\n offset: offset\n };\n },\n\n /**\r\n * @description Execute command of command button(All Buttons except submenu and dialog)\r\n * (redo, undo, bold, underline, italic, strikethrough, subscript, superscript, removeFormat, indent, outdent, fullscreen, showBlocks, codeview, preview, print)\r\n * @param {Element} target - The element of command button\r\n * @param {String} command - Property of command button (data-value)\r\n */\n commandHandler: function (target, command) {\n switch (command) {\n case 'codeView':\n this.controllersOff();\n this.toggleCodeView();\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'fullScreen':\n this.controllersOff();\n this.toggleFullScreen(target);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'indent':\n case 'outdent':\n this.indent(command);\n break;\n\n case 'redo':\n case 'undo':\n this.execCommand(command, false, null);\n break;\n\n case 'removeFormat':\n this.removeFormat();\n break;\n\n case 'preview':\n case 'print':\n this.openWindowContents(command);\n break;\n\n case 'showBlocks':\n this.toggleDisplayBlocks();\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'subscript':\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].hasClass(context.tool.superscript, 'on')) {\n this.execCommand('superscript', false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.tool.superscript, 'on');\n }\n\n this.execCommand(command, false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n case 'superscript':\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].hasClass(context.tool.subscript, 'on')) {\n this.execCommand('subscript', false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.tool.subscript, 'on');\n }\n\n this.execCommand(command, false, null);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n break;\n\n default:\n // 'bold', 'underline', 'italic', 'strike'\n this.execCommand(command, false, target.getAttribute('data-value'));\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(target, 'on');\n }\n\n this.focus();\n },\n\n /**\r\n * @description Remove format of the currently selected range (IE, Edge not working)\r\n */\n removeFormat: function () {\n this.nodeChange(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('REMOVENODE'));\n },\n\n /**\r\n * @description This method implements indentation to selected range.\r\n * Setted \"margin-left\" to \"25px\" in the top \"P\" tag of the parameter node.\r\n * @param command {String} - Separator (\"indent\" or \"outdent\")\r\n */\n indent: function (command) {\n const rangeLines = this.getSelectedFormatElements();\n let p, margin;\n\n for (let i = 0, len = rangeLines.length; i < len; i++) {\n p = rangeLines[i];\n margin = /\\d+/.test(p.style.marginLeft) ? p.style.marginLeft.match(/\\d+/)[0] * 1 : 0;\n\n if ('indent' === command) {\n margin += 25;\n } else {\n margin -= 25;\n }\n\n p.style.marginLeft = (margin < 0 ? 0 : margin) + 'px';\n }\n },\n\n /**\r\n * @description Add or remove the class name of \"body\" so that the code block is visible\r\n */\n toggleDisplayBlocks: function () {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(context.element.wysiwyg, 'sun-editor-show-block');\n },\n\n /**\r\n * @description Changes to code view or wysiwyg view\r\n */\n toggleCodeView: function () {\n const wysiwygActive = this._variable.wysiwygActive;\n const disButtons = this.codeViewDisabledButtons;\n\n for (let i = 0, len = disButtons.length; i < len; i++) {\n disButtons[i].disabled = wysiwygActive;\n }\n\n if (!wysiwygActive) {\n const code_html = context.element.code.value.trim();\n context.element.wysiwyg.innerHTML = code_html.length > 0 ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(code_html) : '

    ' + _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace + '

    ';\n context.element.wysiwyg.scrollTop = 0;\n context.element.code.style.display = 'none';\n context.element.wysiwyg.style.display = 'block';\n if (context.option.height === 'auto') context.element.code.style.height = '0px';\n this._variable.wysiwygActive = true;\n this.focus();\n } else {\n context.element.code.value = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertHTMLForCodeView(context.element.wysiwyg.innerHTML.trim());\n context.element.wysiwyg.style.display = 'none';\n context.element.code.style.display = 'block';\n if (context.option.height === 'auto') context.element.code.style.height = context.element.code.scrollHeight > 0 ? context.element.code.scrollHeight + 'px' : 'auto';\n this._variable.wysiwygActive = false;\n context.element.code.focus();\n }\n },\n\n /**\r\n * @description Changes to full screen or default screen\r\n * @param {Element} element - full screen button\r\n */\n toggleFullScreen: function (element) {\n if (!this._variable.isFullScreen) {\n this._variable.isFullScreen = true;\n context.element.topArea.style.position = 'fixed';\n context.element.topArea.style.top = '0';\n context.element.topArea.style.left = '0';\n context.element.topArea.style.width = '100%';\n context.element.topArea.style.height = '100%';\n context.element.topArea.style.zIndex = '2147483647';\n this._variable._bodyOverflow = _d.body.style.overflow;\n _d.body.style.overflow = 'hidden';\n this._variable._editorAreaOriginCssText = context.element.editorArea.style.cssText;\n this._variable._wysiwygOriginCssText = context.element.wysiwyg.style.cssText;\n this._variable._codeOriginCssText = context.element.code.style.cssText;\n context.element.editorArea.style.cssText = context.element.toolbar.style.cssText = context.element.wysiwyg.style.cssText = context.element.code.style.cssText = '';\n context.element.toolbar.style.width = context.element.wysiwyg.style.height = context.element.code.style.height = '100%';\n context.element.toolbar.style.position = 'relative';\n this._variable.innerHeight_fullScreen = _w.innerHeight - context.element.toolbar.offsetHeight;\n context.element.editorArea.style.height = this._variable.innerHeight_fullScreen + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.firstElementChild, 'icon-expansion');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.firstElementChild, 'icon-reduction');\n } else {\n this._variable.isFullScreen = false;\n context.element.code.style.cssText = this._variable._codeOriginCssText;\n context.element.wysiwyg.style.cssText = this._variable._wysiwygOriginCssText;\n context.element.toolbar.style.cssText = '';\n context.element.editorArea.style.cssText = this._variable._editorAreaOriginCssText;\n context.element.topArea.style.cssText = this._variable._originCssText;\n _d.body.style.overflow = this._variable._bodyOverflow;\n\n if (context.option.stickyToolbar > -1) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element.toolbar, 'sun-editor-sticky');\n event.onScroll_window();\n }\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.firstElementChild, 'icon-reduction');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.firstElementChild, 'icon-expansion');\n }\n },\n\n /**\r\n * @description Open the preview window or open the print window\r\n * @param {String} mode - 'preview' or 'print'\r\n */\n openWindowContents: function (mode) {\n const isPrint = mode === 'print';\n\n const windowObject = _w.open('', '_blank');\n\n windowObject.mimeType = 'text/html';\n windowObject.document.write('' + '' + '' + '' + '' + '' + (isPrint ? lang.toolbar.print : lang.toolbar.preview) + '' + '' + '' + '' + '
    ' + this.getContents() + '
    ' + (isPrint ? '' : '') + '' + '');\n },\n\n /**\r\n * @description Gets the current contents\r\n * @returns {Object}\r\n */\n getContents: function () {\n let contents = '';\n if (context.element.wysiwyg.innerText.trim().length === 0) return contents;\n\n if (editor._variable.wysiwygActive) {\n contents = context.element.wysiwyg.innerHTML;\n } else {\n contents = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(context.element.code.value);\n }\n\n const renderHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n renderHTML.innerHTML = contents;\n const figcaptions = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(renderHTML, function (current) {\n return /FIGCAPTION/i.test(current.nodeName);\n });\n\n for (let i = 0, len = figcaptions.length; i < len; i++) {\n figcaptions[i].outerHTML = figcaptions[i].outerHTML.replace(/(?!^]*>)/i, '');\n }\n\n return renderHTML.innerHTML;\n }\n };\n /**\r\n * @description event function\r\n */\n\n const event = {\n _shortcutKeyCode: {\n 66: ['bold', 'B'],\n 83: ['strikethrough', 'STRIKE'],\n 85: ['underline', 'U'],\n 73: ['italic', 'I'],\n 89: ['redo'],\n 90: ['undo'],\n 219: ['outdent'],\n 221: ['indent']\n },\n _directionKeyKeyCode: new RegExp('^(?:8|13|32|46|33|34|35|36|37|38|39|40|98|100|102|104)$'),\n _changeButtonClassTagCheck: new RegExp('^(?:B|U|I|STRIKE|SUB|SUP)$'),\n _findButtonEffectTag: function () {\n const commandMap = editor.commandMap;\n const classOnCheck = this._changeButtonClassTagCheck;\n const commandMapNodes = [];\n const currentNodes = [];\n let findFormat = true,\n findFont = true,\n findSize = true,\n findA = true;\n let findB = true,\n findI = true,\n findU = true,\n findS = true;\n let cssText = '',\n nodeName = '';\n\n for (let selectionParent = editor.getSelectionNode(); !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionParent); selectionParent = selectionParent.parentNode) {\n if (!selectionParent) break;\n if (selectionParent.nodeType !== 1) continue;\n nodeName = selectionParent.nodeName.toUpperCase();\n currentNodes.push(nodeName);\n /** Format */\n\n if (findFormat && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionParent)) {\n commandMapNodes.push('FORMAT');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FORMAT, nodeName);\n findFormat = false;\n continue;\n }\n /** Font */\n\n\n if (findFont && (selectionParent.style.fontFamily.length > 0 || selectionParent.face && selectionParent.face.length > 0)) {\n commandMapNodes.push('FONT');\n const selectFont = (selectionParent.style.fontFamily || selectionParent.face || lang.toolbar.font).replace(/[\"']/g, '');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.FONT, selectFont);\n findFont = false;\n }\n /** A */\n\n\n if (findA && /^A$/.test(nodeName) && selectionParent.getAttribute('data-image-link') === null) {\n if (!context.link || editor.controllerArray[0] !== context.link.linkBtn) {\n editor.callPlugin('link', function () {\n editor.plugins.link.call_controller_linkButton.call(editor, selectionParent);\n });\n }\n\n findA = false;\n } else if (findA && context.link && editor.controllerArray[0] === context.link.linkBtn) {\n editor.controllersOff();\n }\n /** SPAN */\n\n\n if (findSize && /^SPAN$/.test(nodeName)) {\n /** font size */\n if (selectionParent.style.fontSize.length > 0) {\n commandMapNodes.push('SIZE');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap.SIZE, selectionParent.style.fontSize);\n findSize = false;\n }\n }\n /** command map */\n\n\n cssText = selectionParent.style.cssText;\n\n if (findB && /font\\-weight\\s*:\\s*(?:\\d+|bold|bolder)(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('B');\n findB = false;\n }\n\n if (findI && /font\\-style\\s*:\\s*(?:italic|oblique)(?:;|\\s)/.test(cssText)) {\n commandMapNodes.push('I');\n findI = false;\n }\n\n if (findU && /text\\-decoration(?:\\-line)?\\s*:\\s*underline(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('U');\n findU = false;\n }\n\n if (findS && /text\\-decoration(?:\\-line)?\\s*:\\s*line-through(?:;|\\s|)/.test(cssText)) {\n commandMapNodes.push('STRIKE');\n findS = false;\n }\n\n commandMapNodes.push(/^STRONG$/.test(nodeName) ? 'B' : /^EM$/.test(nodeName) ? 'I' : nodeName);\n }\n /** A Tag edit controller off */\n\n\n if (findA) editor.controllersOff();\n /** toggle class on */\n\n for (let i = 0; i < commandMapNodes.length; i++) {\n nodeName = commandMapNodes[i];\n\n if (classOnCheck.test(nodeName)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(commandMap[nodeName], 'on');\n }\n }\n /** remove class, display text */\n\n\n for (let key in commandMap) {\n if (commandMapNodes.indexOf(key) > -1) continue;\n\n if (/^FONT/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.font);\n } else if (/^SIZE$/i.test(key)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].changeTxt(commandMap[key], lang.toolbar.fontSize);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(commandMap[key], 'on');\n }\n }\n /** save current nodes */\n\n\n editor._variable.currentNodes = currentNodes.reverse();\n /** Displays the current node structure to resizingBar */\n\n if (context.option.showPathLabel) context.element.navigation.textContent = editor._variable.currentNodes.join(' > ');\n },\n _cancelCaptionEdit: function () {\n this.setAttribute('contenteditable', false);\n this.removeEventListener('blur', event._cancelCaptionEdit);\n },\n onMouseDown_toolbar: function (e) {\n editor._editorRange();\n\n e.preventDefault();\n let target = e.target;\n\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(target, '.sun-editor-submenu')) {\n e.stopPropagation();\n } else {\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n className = target.className;\n }\n\n if (command === editor._submenuName) {\n e.stopPropagation();\n }\n }\n },\n onClick_toolbar: function (e) {\n e.preventDefault();\n e.stopPropagation();\n let target = e.target;\n let display = target.getAttribute('data-display');\n let command = target.getAttribute('data-command');\n let className = target.className;\n\n while (!command && !/editor_tool/.test(className) && !/sun-editor-id-toolbar/.test(className)) {\n target = target.parentNode;\n command = target.getAttribute('data-command');\n display = target.getAttribute('data-display');\n className = target.className;\n }\n\n if (!command && !display) return;\n if (target.disabled) return;\n /** Dialog, Submenu */\n\n if (display) {\n if (/submenu/.test(display) && (target.nextElementSibling === null || target !== editor.submenuActiveButton)) {\n editor.callPlugin(command, function () {\n editor.submenuOn(target);\n });\n return;\n } else if (/dialog/.test(display)) {\n editor.callPlugin(command, function () {\n editor.plugins.dialog.open.call(editor, command, false);\n });\n return;\n }\n\n editor.submenuOff();\n return;\n }\n /** default command */\n\n\n if (command) {\n editor.focus();\n editor.commandHandler(target, command);\n }\n },\n onMouseUp_wysiwyg: function () {\n editor._editorRange();\n\n if (editor._isBalloon) {\n const range = editor.getRange();\n if (range.collapsed) event._hideToolbar();else event._showToolbarBalloon(range);\n }\n },\n onClick_wysiwyg: function (e) {\n e.stopPropagation();\n const targetElement = e.target;\n\n if (/^IMG$/i.test(targetElement.nodeName)) {\n e.preventDefault();\n editor.callPlugin('image', function () {\n const size = editor.plugins.resizing.call_controller_resize.call(editor, targetElement, 'image');\n editor.plugins.image.onModifyMode.call(editor, targetElement, size);\n\n if (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, '.sun-editor-id-image-container')) {\n editor.plugins.image.openModify.call(editor, true);\n editor.plugins.image.update_image.call(editor);\n editor.controllersOff();\n }\n });\n return;\n }\n\n if (/sun-editor-id-iframe-inner-resizing-cover/i.test(targetElement.className)) {\n e.preventDefault();\n editor.callPlugin('video', function () {\n const iframe = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getChildElement(targetElement.parentNode, 'iframe');\n const size = editor.plugins.resizing.call_controller_resize.call(editor, iframe, 'video');\n editor.plugins.video.onModifyMode.call(editor, iframe, size);\n });\n return;\n }\n\n event._findButtonEffectTag();\n\n const figcaption = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, 'FIGCAPTION');\n\n if (figcaption && figcaption.getAttribute('contenteditable') !== 'ture') {\n e.preventDefault();\n figcaption.setAttribute('contenteditable', true);\n figcaption.focus();\n\n if (editor._isInline && !editor._inlineToolbarAttr.isShow) {\n event._showToolbarInline();\n\n const hideToolbar = function () {\n event._hideToolbar();\n\n _d.removeEventListener('click', hideToolbar);\n };\n\n _d.addEventListener('click', hideToolbar);\n }\n } else {\n const td = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(targetElement, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n\n if (td) {\n if (editor.controllerArray.length === 0) {\n editor.callPlugin('table', editor.plugins.table.call_controller_tableEdit.bind(editor, td));\n }\n }\n }\n\n if (userFunction.onClick) userFunction.onClick(e);\n },\n _showToolbarBalloon: function (rangeObj) {\n const range = rangeObj || editor.getRange();\n const padding = 20;\n const toolbar = context.element.toolbar;\n\n const selection = _w.getSelection();\n\n let isDirTop;\n\n if (selection.focusNode === selection.anchorNode) {\n isDirTop = selection.focusOffset < selection.anchorOffset;\n } else {\n const childNodes = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildNodes(range.commonAncestorContainer);\n isDirTop = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.focusNode) < _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getArrayIndex(childNodes, selection.anchorNode);\n }\n\n let rects = range.getClientRects();\n rects = rects[isDirTop ? 0 : rects.length - 1];\n toolbar.style.display = 'block';\n const toolbarWidth = toolbar.offsetWidth;\n const toolbarHeight = toolbar.offsetHeight;\n let l = (isDirTop ? rects.left : rects.right) - context.element.topArea.offsetLeft + (_w.scrollX || _d.documentElement.scrollLeft) - toolbarWidth / 2;\n let t = (isDirTop ? rects.top - toolbarHeight - 11 : rects.bottom + 11) - context.element.topArea.offsetTop + (_w.scrollY || _d.documentElement.scrollTop);\n const overRight = l + toolbarWidth - context.element.topArea.offsetWidth;\n toolbar.style.left = (l < 0 ? padding : overRight < 0 ? l : l - overRight - padding) + 'px';\n toolbar.style.top = t + 'px';\n\n if (isDirTop) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-up');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-down');\n context.element._arrow.style.top = toolbarHeight + 'px';\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(context.element._arrow, 'arrow-down');\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element._arrow, 'arrow-up');\n context.element._arrow.style.top = '-11px';\n }\n\n const arrow_width = context.element._arrow.offsetWidth;\n const arrow_left = toolbarWidth / 2 + (l < 0 ? l - arrow_width : overRight < 0 ? 0 : overRight + arrow_width);\n const arrow_point_width = arrow_width / 2;\n context.element._arrow.style.left = (arrow_left < arrow_point_width ? arrow_point_width : arrow_left + arrow_point_width >= toolbarWidth ? arrow_left - arrow_point_width : arrow_left) + 'px';\n },\n _showToolbarInline: function () {\n const toolbar = context.element.toolbar;\n toolbar.style.display = 'block';\n editor._inlineToolbarAttr.width = toolbar.style.width = context.option.toolbarWidth;\n editor._inlineToolbarAttr.top = toolbar.style.top = -1 - toolbar.offsetHeight + 'px';\n event.onScroll_window();\n editor._inlineToolbarAttr.isShow = true;\n },\n _hideToolbar: function () {\n context.element.toolbar.style.display = 'none';\n editor._inlineToolbarAttr.isShow = false;\n },\n onKeyDown_wysiwyg: function (e) {\n const keyCode = e.keyCode;\n const shift = e.shiftKey;\n const ctrl = e.ctrlKey || e.metaKey;\n const alt = e.altKey;\n\n if (editor._isBalloon) {\n event._hideToolbar();\n }\n\n function shortcutCommand(keyCode) {\n const key = event._shortcutKeyCode[keyCode];\n if (!key) return false;\n editor.commandHandler(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getFormatElement(editor.getSelectionNode()), key[0]);\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].toggleClass(editor.commandMap[key[1]], 'on');\n return true;\n }\n /** Shortcuts */\n\n\n if (ctrl && !/^(?:16|17|18)$/.test(keyCode)) {\n if (!(!shift && keyCode === 83) && shortcutCommand(keyCode)) {\n e.preventDefault();\n return;\n }\n }\n /** default key action */\n\n\n const selectionNode = editor.getSelectionNode();\n\n switch (keyCode) {\n case 8:\n /**backspace key*/\n if (_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(selectionNode) && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentNode) && selectionNode.previousSibling === null) {\n e.preventDefault();\n e.stopPropagation();\n selectionNode.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n return false;\n }\n\n break;\n\n case 9:\n /**tab key*/\n e.preventDefault();\n if (ctrl || alt) break;\n editor.controllersOff();\n let currentNode = selectionNode || editor.getSelectionNode();\n\n while (!_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode) && !_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(currentNode)) {\n currentNode = currentNode.parentNode;\n }\n\n if (currentNode && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell(currentNode)) {\n const table = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getParentElement(currentNode, 'table');\n const cells = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].getListChildren(table, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isCell);\n let idx = shift ? _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].prevIdx(cells, currentNode) : _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].nextIdx(cells, currentNode);\n if (idx === cells.length && !shift) idx = 0;\n if (idx === -1 && shift) idx = cells.length - 1;\n const moveCell = cells[idx];\n if (!moveCell) return false;\n editor.setRange(moveCell, 0, moveCell, 0);\n break;\n }\n /** format Tag */\n\n\n const lines = editor.getSelectedFormatElements();\n\n if (!shift) {\n const tabText = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createTextNode(new Array(editor._variable.tabSize + 1).join('\\u00A0'));\n\n if (lines.length === 1) {\n editor.insertNode(tabText);\n editor.setRange(tabText, editor._variable.tabSize, tabText, editor._variable.tabSize);\n } else {\n for (let i = 0, len = lines.length; i < len; i++) {\n lines[i].insertBefore(tabText.cloneNode(false), lines[i].firstChild);\n }\n }\n } else {\n for (let i = 0, len = lines.length, child; i < len; i++) {\n child = lines[i].firstChild;\n\n if (/^\\s{1,4}$/.test(child.textContent)) {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(child);\n } else if (/^\\s{1,4}/.test(child.textContent)) {\n child.textContent = child.textContent.replace(/^\\s{1,4}/, '');\n }\n }\n }\n\n break;\n }\n\n if (userFunction.onKeyDown) userFunction.onKeyDown(e);\n },\n onKeyUp_wysiwyg: function (e) {\n editor._editorRange();\n\n editor.controllersOff();\n const selectionNode = editor.getSelectionNode();\n\n if (editor._isBalloon && !editor.getRange().collapsed) {\n event._showToolbarBalloon();\n\n return;\n }\n /** when format tag deleted */\n\n\n if (e.keyCode === 8 && _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode) && context.element.wysiwyg.textContent.length === 0) {\n e.preventDefault();\n e.stopPropagation();\n const oFormatTag = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement(_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isFormatElement(editor._variable.currentNodes[0]) ? editor._variable.currentNodes[0] : 'P');\n oFormatTag.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].zeroWidthSpace;\n selectionNode.appendChild(oFormatTag);\n editor.setRange(oFormatTag, 0, oFormatTag, 0);\n return;\n }\n\n if ((_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) || _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isRangeFormatElement(selectionNode.parentElement)) && selectionNode.nodeType === 3) {\n editor.execCommand('formatBlock', false, _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].isWysiwygDiv(selectionNode.parentElement) ? 'P' : 'DIV');\n\n event._findButtonEffectTag();\n\n return;\n }\n\n if (event._directionKeyKeyCode.test(e.keyCode)) {\n event._findButtonEffectTag();\n }\n\n if (userFunction.onKeyUp) userFunction.onKeyUp(e);\n },\n onScroll_wysiwyg: function (e) {\n editor.controllersOff();\n if (userFunction.onScroll) userFunction.onScroll(e);\n },\n onDrop_wysiwyg: function (e) {\n const files = e.dataTransfer.files;\n\n if (files.length > 0) {\n e.stopPropagation();\n e.preventDefault();\n editor.focus();\n editor.callPlugin('image', function () {\n context.image.imgInputFile.files = files;\n editor.plugins.image.onRender_imgInput.call(editor);\n context.image.imgInputFile.files = null;\n });\n }\n\n if (userFunction.onDrop) userFunction.onDrop(e);\n },\n onMouseDown_resizingBar: function (e) {\n e.stopPropagation();\n editor._variable.resizeClientY = e.clientY;\n context.element.resizeBackground.style.display = 'block';\n\n function closureFunc() {\n context.element.resizeBackground.style.display = 'none';\n\n _d.removeEventListener('mousemove', event._resize_editor);\n\n _d.removeEventListener('mouseup', closureFunc);\n }\n\n _d.addEventListener('mousemove', event._resize_editor);\n\n _d.addEventListener('mouseup', closureFunc);\n },\n _resize_editor: function (e) {\n const resizeInterval = context.element.editorArea.offsetHeight + (e.clientY - editor._variable.resizeClientY);\n context.element.wysiwyg.style.height = context.element.code.style.height = (resizeInterval < editor._variable.minResizingSize ? editor._variable.minResizingSize : resizeInterval) + 'px';\n editor._variable.resizeClientY = e.clientY;\n },\n onResize_window: function () {\n if (context.element.toolbar.offsetWidth === 0) return;\n\n if (editor._variable.isFullScreen) {\n editor._variable.innerHeight_fullScreen += _w.innerHeight - context.element.toolbar.offsetHeight - editor._variable.innerHeight_fullScreen;\n context.element.editorArea.style.height = editor._variable.innerHeight_fullScreen + 'px';\n } else if (editor._variable._sticky) {\n context.element.toolbar.style.width = context.element.topArea.offsetWidth - 2 + 'px';\n event.onScroll_window();\n }\n\n editor.controllersOff();\n },\n onScroll_window: function () {\n if (editor._variable.isFullScreen || context.element.toolbar.offsetWidth === 0) return;\n const element = context.element;\n const editorHeight = element.editorArea.offsetHeight;\n const editorTop = element.topArea.offsetTop - (editor._isInline ? element.toolbar.offsetHeight : 0);\n const y = (this.scrollY || _d.documentElement.scrollTop) + context.option.stickyToolbar;\n\n if (y < editorTop) {\n event._offStickyToolbar(element);\n } else if (y + editor._variable.minResizingSize >= editorHeight + editorTop) {\n if (!editor._variable._sticky) event._onStickyToolbar(element);\n element.toolbar.style.top = editorHeight + editorTop + context.option.stickyToolbar - y - editor._variable.minResizingSize + 'px';\n } else if (y >= editorTop) {\n event._onStickyToolbar(element);\n }\n },\n _onStickyToolbar: function (element) {\n if (!editor._isInline) {\n element._stickyDummy.style.height = element.toolbar.offsetHeight + 'px';\n element._stickyDummy.style.display = 'block';\n }\n\n element.toolbar.style.top = context.option.stickyToolbar + 'px';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : element.toolbar.offsetWidth + 'px';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = true;\n },\n _offStickyToolbar: function (element) {\n element._stickyDummy.style.display = 'none';\n element.toolbar.style.top = editor._isInline ? editor._inlineToolbarAttr.top : '';\n element.toolbar.style.width = editor._isInline ? editor._inlineToolbarAttr.width : '';\n element.editorArea.style.marginTop = '';\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeClass(element.toolbar, 'sun-editor-sticky');\n editor._variable._sticky = false;\n },\n _codeViewAutoScroll: function () {\n context.element.code.style.height = context.element.code.scrollHeight + 'px';\n },\n onPaste_wysiwyg: function (e) {\n if (!e.clipboardData.getData) return true;\n const cleanData = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].cleanHTML(e.clipboardData.getData('text/html'));\n\n if (cleanData) {\n editor.execCommand('insertHTML', false, cleanData);\n e.stopPropagation();\n e.preventDefault();\n }\n }\n };\n /** add event listeners */\n\n /** toolbar event */\n\n context.element.toolbar.addEventListener('mousedown', event.onMouseDown_toolbar, false);\n context.element.toolbar.addEventListener('click', event.onClick_toolbar, false);\n /** editor area */\n\n context.element.relative.addEventListener('click', editor.focus.bind(editor), false);\n context.element.wysiwyg.addEventListener('mouseup', event.onMouseUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('click', event.onClick_wysiwyg, false);\n context.element.wysiwyg.addEventListener('scroll', event.onScroll_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keydown', event.onKeyDown_wysiwyg, false);\n context.element.wysiwyg.addEventListener('keyup', event.onKeyUp_wysiwyg, false);\n context.element.wysiwyg.addEventListener('drop', event.onDrop_wysiwyg, false);\n context.element.wysiwyg.addEventListener('paste', event.onPaste_wysiwyg, false);\n /** code view area auto line */\n\n if (context.option.height === 'auto') context.element.code.addEventListener('keyup', event._codeViewAutoScroll, false);\n /** resizingBar */\n\n if (context.element.resizingBar) {\n if (/\\d+/.test(context.option.height)) {\n context.element.resizingBar.addEventListener('mousedown', event.onMouseDown_resizingBar, false);\n } else {\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].addClass(context.element.resizingBar, 'none-resize');\n }\n }\n /** inline editor */\n\n\n if (editor._isInline) {\n context.element.wysiwyg.addEventListener('focus', event._showToolbarInline, false);\n }\n\n if (editor._isInline || editor._isBalloon) {\n context.element.wysiwyg.addEventListener('blur', event._hideToolbar, false);\n }\n /** window event */\n\n\n _w.addEventListener('resize', event.onResize_window, false);\n\n if (context.option.stickyToolbar > -1) _w.addEventListener('scroll', event.onScroll_window, false);\n /** add plugin to plugins object */\n\n if (plugins) {\n Object.keys(plugins).map(function (key) {\n let plugin = plugins[key];\n editor.plugins[plugin.name] = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(plugin);\n });\n }\n /** User function */\n\n\n const userFunction = {\n /**\r\n * @description Event functions\r\n * @param {Object} event - Event Object\r\n */\n onScroll: null,\n onClick: null,\n onKeyDown: null,\n onKeyUp: null,\n onDrop: null,\n\n /**\r\n * @description Called when the image is uploaded or the uploaded image is deleted\r\n * @param {Element} targetImgElement - Current img element\r\n * @param {Number} index - Uploaded index\r\n * @param {Boolean} isDelete - Whether or not it was called after the delete operation\r\n */\n onImageUpload: null,\n\n /**\r\n * @description Open a notice area\r\n * @param {String} message - Notice message\r\n */\n noticeOpen: function (message) {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].open.call(editor, message);\n },\n\n /**\r\n * @description Close a notice area\r\n */\n noticeClose: function () {\n editor.addModule([_plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"]]);\n _plugins_modules_notice__WEBPACK_IMPORTED_MODULE_1__[\"default\"].close.call(editor);\n },\n\n /**\r\n * @description Copying the contents of the editor to the original textarea\r\n */\n save: function () {\n context.element.originElement.value = editor.getContents();\n },\n\n /**\r\n * @description Gets the suneditor's context object. Contains settings, plugins, and cached element objects\r\n * @returns {Object}\r\n */\n getContext: function () {\n return context;\n },\n\n /**\r\n * @description Gets the contents of the suneditor\r\n * @returns {String}\r\n */\n getContents: function () {\n return editor.getContents();\n },\n\n /**\r\n * @description Gets uploaded images informations\r\n * @returns {Array}\r\n */\n getImagesInfo: function () {\n return editor._variable._imagesInfo;\n },\n\n /**\r\n * @description Inserts an HTML element or HTML string or plain string at the current cursor position\r\n * @param {Element|String} html - HTML Element or HTML string or plain string\r\n */\n insertHTML: function (html) {\n if (!html.nodeType || html.nodeType !== 1) {\n const template = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('template');\n template.innerHTML = html;\n html = template.firstChild || template.content.firstChild;\n }\n\n editor.insertNode(html);\n editor.focus();\n },\n\n /**\r\n * @description Change the contents of the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n setContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML = _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value = contents;\n }\n },\n\n /**\r\n * @description Add contents to the suneditor\r\n * @param {String} contents - Contents to Input\r\n */\n appendContents: function (contents) {\n if (editor._variable.wysiwygActive) {\n context.element.wysiwyg.innerHTML += _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].convertContentsForEditor(contents);\n } else {\n context.element.code.value += contents;\n }\n },\n\n /**\r\n * @description Disable the suneditor\r\n */\n disabled: function () {\n context.tool.cover.style.display = 'block';\n context.element.wysiwyg.setAttribute('contenteditable', false);\n context.element.code.setAttribute('disabled', 'disabled');\n },\n\n /**\r\n * @description Enabled the suneditor\r\n */\n enabled: function () {\n context.tool.cover.style.display = 'none';\n context.element.wysiwyg.setAttribute('contenteditable', true);\n context.element.code.removeAttribute('disabled');\n },\n\n /**\r\n * @description Show the suneditor\r\n */\n show: function () {\n const topAreaStyle = context.element.topArea.style;\n if (topAreaStyle.display === 'none') topAreaStyle.display = context.option.display;\n },\n\n /**\r\n * @description Hide the suneditor\r\n */\n hide: function () {\n context.element.topArea.style.display = 'none';\n },\n\n /**\r\n * @description Destroy the suneditor\r\n */\n destroy: function () {\n /** remove window event listeners */\n _w.removeEventListener('resize', event.onResize_window);\n\n _w.removeEventListener('scroll', event.onScroll_window);\n /** remove element */\n\n\n _util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].removeItem(context.element.topArea);\n this.onScroll = null;\n this.onClick = null;\n this.onKeyDown = null;\n this.onKeyUp = null;\n this.onDrop = null;\n this.save = null;\n this.onImageUpload = null;\n this.noticeOpen = null;\n this.noticeClose = null;\n this.getContext = null;\n this.getContents = null;\n this.getImagesInfo = null;\n this.insertHTML = null;\n this.setContents = null;\n this.appendContents = null;\n this.disabled = null;\n this.enabled = null;\n this.show = null;\n this.hide = null;\n this.destroy = null;\n context = null;\n plugins = null;\n lang = null;\n }\n };\n return userFunction;\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (core);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbGliL2NvcmUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvbGliL2NvcmUuanM/OGE4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcclxuICpcclxuICogc3VuZWRpdG9yLmpzXHJcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXHJcbiAqIE1JVCBsaWNlbnNlLlxyXG4gKi9cclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxuaW1wb3J0IHV0aWwgZnJvbSAnLi91dGlsJztcclxuaW1wb3J0IG5vdGljZSBmcm9tICcuLi9wbHVnaW5zL21vZHVsZXMvbm90aWNlJztcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gU3VuRWRpdG9yIGNvcmUgY2xvc3VyZVxyXG4gKiBAcGFyYW0gY29udGV4dFxyXG4gKiBAcGFyYW0gcGx1Z2luc1xyXG4gKiBAcGFyYW0gbGFuZ1xyXG4gKiBAcmV0dXJucyB7e3NhdmU6IHNhdmUsIGdldENvbnRleHQ6IGdldENvbnRleHQsIGdldENvbnRlbnQ6IGdldENvbnRlbnQsIHNldENvbnRlbnQ6IHNldENvbnRlbnQsIGFwcGVuZENvbnRlbnQ6IGFwcGVuZENvbnRlbnQsIGRpc2FibGVkOiBkaXNhYmxlZCwgZW5hYmxlZDogZW5hYmxlZCwgc2hvdzogc2hvdywgaGlkZTogaGlkZSwgZGVzdHJveTogZGVzdHJveX19XHJcbiAqL1xyXG5jb25zdCBjb3JlID0gZnVuY3Rpb24gKGNvbnRleHQsIHBsdWdpbnMsIGxhbmcpIHtcclxuICAgIGNvbnN0IF9kID0gZG9jdW1lbnQ7XHJcbiAgICBjb25zdCBfdyA9IHdpbmRvdztcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGVkaXRvciBjb3JlIG9iamVjdFxyXG4gICAgICogc2hvdWxkIGFsd2F5cyBiaW5kIHRoaXMgb2JqZWN0IHdoZW4gcmVnaXN0ZXJpbmcgYW4gZXZlbnQgaW4gdGhlIHBsdWctaW4uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IGVkaXRvciA9IHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgYW5kIHVzZXIgb3B0aW9ucyBwYXJhbWV0ZXJzIG9mIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gbG9hZGVkIHBsdWdpbnNcclxuICAgICAgICAgKi9cclxuICAgICAgICBwbHVnaW5zOiB7fSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluaXRQbHVnaW5zOiB7fSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIGxvYWRlZCBsYW5ndWFnZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGxhbmc6IGxhbmcsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBkaWFsb2cgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRpYWxvZ0Zvcm06IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBjdXJyZW50IHN1Ym1lbnQgbmFtZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX3N1Ym1lbnVOYW1lOiAnJyxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHN1Ym1lbnUgZWxlbWVudFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnU6IG51bGwsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBiaW5kZWQgc3VibWVudU9mZiBtZXRob2RcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9iaW5kZWRTdWJtZW51T2ZmOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYWN0aXZlIGJ1dHRvbiBlbGVtZW50IGluIHN1Ym1lbnVcclxuICAgICAgICAgKi9cclxuICAgICAgICBzdWJtZW51QWN0aXZlQnV0dG9uOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gVGhlIGVsZW1lbnRzIGFycmF5IHRvIGJlIHByb2Nlc3NlZCB1bnZpc2libGUgd2hlbiB0aGUgY29udHJvbGxlcnNPZmYgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgKHJlc2l6aW5nLCBsaW5rIG1vZGlmaWVkIGJ1dHRvbiwgdGFibGUgY29udHJvbGxlcilcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb250cm9sbGVyQXJyYXk6IFtdLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYmluZGVkIGNvbnRyb2xsZXJzT2ZmIG1ldGhvZFxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2JpbmRDb250cm9sbGVyc09mZjogbnVsbCxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIGFycmF5IG9mIGJ1dHRvbnMgd2hvc2UgY2xhc3MgbmFtZSBpcyBub3QgXCJjb2RlLXZpZXctZW5hYmxlZFwiXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29kZVZpZXdEaXNhYmxlZEJ1dHRvbnM6IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdW4tZWRpdG9yLWlkLXRvb2xiYXIgYnV0dG9uOm5vdChbY2xhc3N+PVwiY29kZS12aWV3LWVuYWJsZWRcIl0pJyksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJcyBpbmxpbmUgbW9kZT9cclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9pc0lubGluZTogL2lubGluZS9pLnRlc3QoY29udGV4dC5vcHRpb24ubW9kZSksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJcyBiYWxsb29uIG1vZGU/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaXNCYWxsb29uOiAvYmFsbG9vbi9pLnRlc3QoY29udGV4dC5vcHRpb24ubW9kZSksXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZXF1aXJlZCB2YWx1ZSB3aGVuIHVzaW5nIGlubGluZSBtb2RlIHRvIHN0aWNreSB0b29sYmFyXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfaW5saW5lVG9vbGJhckF0dHI6IHt3aWR0aDogMCwgaGVpZ2h0OiAwLCBpc1Nob3c6IGZhbHNlfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFuIHVzZXIgZXZlbnQgZnVuY3Rpb24gd2hlbiBpbWFnZSB1cGxvYWRlZCBzdWNjZXNzIG9yIHJlbW92ZSBpbWFnZVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2ltYWdlVXBsb2FkOiBmdW5jdGlvbiAodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXgsIGlzRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25JbWFnZVVwbG9hZCkgdXNlckZ1bmN0aW9uLm9uSW1hZ2VVcGxvYWQodGFyZ2V0SW1nRWxlbWVudCwgaW5kZXgsIGlzRGVsZXRlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZSB0ZXh0IG9yIGNsYXNzTmFtZSBmb3IgZWFjaCBzZWxlY3Rpb24gY2hhbmdlXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT1JNQVQgLSBmb3JtYXQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBGT05UIC0gZm9udCBmYW1pbHkgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBTSVpFIC0gZm9udCBzaXplIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gQiAtIGJvbGQgYnV0dG9uXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtFbGVtZW50fSBVIC0gdW5kZXJsaW5lIGJ1dHRvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gSSAtIGl0YWxpYyBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNUUklLRSAtIHN0cmlrZSBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVQiAtIHN1YnNjcmlwdCBidXR0b25cclxuICAgICAgICAgKiBAcHJvcGVydHkge0VsZW1lbnR9IFNVUCAtIHN1cGVyc2NyaXB0IGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbW1hbmRNYXA6IHtcclxuICAgICAgICAgICAgRk9STUFUOiBjb250ZXh0LnRvb2wuZm9ybWF0LFxyXG4gICAgICAgICAgICBGT05UOiBjb250ZXh0LnRvb2wuZm9udCxcclxuICAgICAgICAgICAgU0laRTogY29udGV4dC50b29sLmZvbnRTaXplLFxyXG4gICAgICAgICAgICBCOiBjb250ZXh0LnRvb2wuYm9sZCxcclxuICAgICAgICAgICAgVTogY29udGV4dC50b29sLnVuZGVybGluZSxcclxuICAgICAgICAgICAgSTogY29udGV4dC50b29sLml0YWxpYyxcclxuICAgICAgICAgICAgU1RSSUtFOiBjb250ZXh0LnRvb2wuc3RyaWtlLFxyXG4gICAgICAgICAgICBTVUI6IGNvbnRleHQudG9vbC5zdWJzY3JpcHQsXHJcbiAgICAgICAgICAgIFNVUDogY29udGV4dC50b29sLnN1cGVyc2NyaXB0XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFZhcmlhYmxlcyB1c2VkIGludGVybmFsbHkgaW4gZWRpdG9yIG9wZXJhdGlvblxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gd3lzaXd5Z0FjdGl2ZSAtIFRoZSB3eXNpd3lnIGZyYW1lIG9yIGNvZGUgdmlldyBzdGF0ZVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gaXNGdWxsU2NyZWVuIC0gU3RhdGUgb2YgZnVsbCBzY3JlZW5cclxuICAgICAgICAgKiBAcHJvcGVydHkge051bWJlcn0gaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiAtIElubmVySGVpZ2h0IGluIGVkaXRvciB3aGVuIGluIGZ1bGwgc2NyZWVuXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHJlc2l6ZUNsaWVudFkgLSBSZW1lbWJlciB0aGUgdmVydGljYWwgc2l6ZSBvZiB0aGUgZWRpdG9yIGJlZm9yZSByZXNpemluZyB0aGUgZWRpdG9yIChVc2VkIHdoZW4gY2FsY3VsYXRpbmcgZHVyaW5nIHJlc2l6ZSBvcGVyYXRpb24pXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IHRhYlNpemUgLSBJbmRlbnRlZCBzaXplIHdoZW4gdGFiIGJ1dHRvbiBjbGlja2VkICg0KVxyXG4gICAgICAgICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBtaW5SZXNpemluZ1NpemUgLSBNaW5pbXVtIHNpemUgb2YgZWRpdGluZyBhcmVhIHdoZW4gcmVzaXplZCAoNjUpXHJcbiAgICAgICAgICogQHByb3BlcnR5IHtBcnJheX0gY3VycmVudE5vZGVzIC0gIEFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGN1cnNvcidzIG5vZGUgc3RydWN0dXJlXHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfdmFyaWFibGU6IHtcclxuICAgICAgICAgICAgd3lzaXd5Z0FjdGl2ZTogdHJ1ZSxcclxuICAgICAgICAgICAgaXNGdWxsU2NyZWVuOiBmYWxzZSxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHRfZnVsbFNjcmVlbjogMCxcclxuICAgICAgICAgICAgcmVzaXplQ2xpZW50WTogMCxcclxuICAgICAgICAgICAgdGFiU2l6ZTogNCxcclxuICAgICAgICAgICAgbWluUmVzaXppbmdTaXplOiA2NSxcclxuICAgICAgICAgICAgY3VycmVudE5vZGVzOiBbXSxcclxuICAgICAgICAgICAgX3JhbmdlOiBudWxsLFxyXG4gICAgICAgICAgICBfc2VsZWN0aW9uTm9kZTogbnVsbCxcclxuICAgICAgICAgICAgX29yaWdpbkNzc1RleHQ6IGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQsXHJcbiAgICAgICAgICAgIF9ib2R5T3ZlcmZsb3c6ICcnLFxyXG4gICAgICAgICAgICBfZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfd3lzaXd5Z09yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfY29kZU9yaWdpbkNzc1RleHQ6ICcnLFxyXG4gICAgICAgICAgICBfc3RpY2t5OiBmYWxzZSxcclxuICAgICAgICAgICAgX2ltYWdlc0luZm86IFtdLFxyXG4gICAgICAgICAgICBfaW1hZ2VJbmRleDogMFxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBJZiB0aGUgcGx1Z2luIGlzIG5vdCBhZGRlZCwgYWRkIHRoZSBwbHVnaW4gYW5kIGNhbGwgdGhlICdhZGQnIGZ1bmN0aW9uLlxyXG4gICAgICAgICAqIElmIHRoZSBwbHVnaW4gaXMgYWRkZWQgY2FsbCBjYWxsQmFjayBmdW5jdGlvbi5cclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gcGx1Z2luTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gdG8gY2FsbFxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxCYWNrRnVuY3Rpb24gLSBGdW5jdGlvbiB0byBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciBtb2R1bGUgY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uIChwbHVnaW5OYW1lLCBjYWxsQmFja0Z1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jb3JlLmNhbGxQbHVnaW4uZmFpbF0gVGhlIGNhbGxlZCBwbHVnaW4gZG9lcyBub3QgZXhpc3Qgb3IgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXQuIChwbHVnaW5OYW1lOlwiJyArIHBsdWdpbk5hbWUgKyAnXCIpJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaW5pdFBsdWdpbnNbcGx1Z2luTmFtZV0pe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW3BsdWdpbk5hbWVdLmFkZCh0aGlzLCB0aGlzLnBsdWdpbnNbcGx1Z2luTmFtZV0uYnV0dG9uRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQbHVnaW5zW3BsdWdpbk5hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNhbGxCYWNrRnVuY3Rpb24oKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gSWYgdGhlIG1vZHVsZSBpcyBub3QgYWRkZWQsIGFkZCB0aGUgbW9kdWxlIGFuZCBjYWxsIHRoZSAnYWRkJyBmdW5jdGlvblxyXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1vZHVsZUFycmF5IC0gbW9kdWxlIG9iamVjdCdzIEFycmF5IFtkaWFsb2csIHJlc2l6aW5nXVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFkZE1vZHVsZTogZnVuY3Rpb24gKG1vZHVsZUFycmF5KSB7XHJcbiAgICAgICAgICAgIGxldCBtb2R1bGVOYW1lID0gJyc7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBtb2R1bGVBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IG1vZHVsZUFycmF5W2ldLm5hbWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luc1ttb2R1bGVOYW1lXSA9IHV0aWwuY29weU9iaihtb2R1bGVBcnJheVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zW21vZHVsZU5hbWVdLmFkZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFbmFibGVkIHN1Ym1lbnVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBTdWJtZW51IGVsZW1lbnQgdG8gY2FsbFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPbjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc3VibWVudU5hbWUgPSB0aGlzLl9zdWJtZW51TmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24pIHRoaXMucGx1Z2luc1tzdWJtZW51TmFtZV0ub24uY2FsbCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudSA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgICAgICAgICB0aGlzLnN1Ym1lbnUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoZWxlbWVudCwgJ29uJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvdmVyTGVmdCA9IHRoaXMuY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggLSAoZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQgKyB0aGlzLnN1Ym1lbnUub2Zmc2V0V2lkdGgpO1xyXG4gICAgICAgICAgICBpZiAob3ZlckxlZnQgPCAwKSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9IG92ZXJMZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgZWxzZSB0aGlzLnN1Ym1lbnUuc3R5bGUubGVmdCA9ICcxcHgnO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYmluZGVkU3VibWVudU9mZiA9IHRoaXMuc3VibWVudU9mZi5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmLCBmYWxzZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgc3VibWVudVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHN1Ym1lbnVPZmY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3VibWVudSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VibWVudU5hbWUgPSAnJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtZW51ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3ModGhpcy5zdWJtZW51QWN0aXZlQnV0dG9uLCAnb24nKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWVudUFjdGl2ZUJ1dHRvbiA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBfZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9iaW5kZWRTdWJtZW51T2ZmKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFyZ3VtZW50c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlckFycmF5W2ldID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9iaW5kQ29udHJvbGxlcnNPZmYgPSB0aGlzLmNvbnRyb2xsZXJzT2ZmLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIF9kLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2JpbmRDb250cm9sbGVyc09mZiwgZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEaXNhYmxlIGNvbnRyb2xsZXIgaW4gZWRpdG9yIGFyZWEgKGxpbmsgYnV0dG9uLCBpbWFnZSByZXNpemUgYnV0dG9uKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnRyb2xsZXJzT2ZmOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHRoaXMuY29udHJvbGxlckFycmF5Lmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyQXJyYXlbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fYmluZENvbnRyb2xsZXJzT2ZmKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbW1hbmQgLSBqYXZhc2NyaXB0IGV4ZWNDb21tYW5kIGZ1bmN0aW9uIHByb3BlcnR5XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBzaG93RGVmYXVsdFVJIC0gamF2YXNjcmlwdCBleGVjQ29tbWFuZCBmdW5jdGlvbiBwcm9wZXJ0eVxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIGphdmFzY3JpcHQgZXhlY0NvbW1hbmQgZnVuY3Rpb24gcHJvcGVydHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBleGVjQ29tbWFuZDogZnVuY3Rpb24gKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIHZhbHVlKSB7XHJcbiAgICAgICAgICAgIF9kLmV4ZWNDb21tYW5kKGNvbW1hbmQsIHNob3dEZWZhdWx0VUksIChjb21tYW5kID09PSAnZm9ybWF0QmxvY2snID8gJzwnICsgdmFsdWUgKyAnPicgOiB2YWx1ZSkpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBGb2N1cyB0byB3eXNpd3lnIGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBmb2N1czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLCAnZmlnY2FwdGlvbicpO1xyXG4gICAgICAgICAgICBpZiAoY2FwdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FwdGlvbi5mb2N1cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZXZlbnQuX2ZpbmRCdXR0b25FZmZlY3RUYWcoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGN1cnJlbnQgZWRpdG9yJ3MgcmFuZ2Ugb2JqZWN0XHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZW5kT2ZmIC0gVGhlIGVuZE9mZnNldCBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRSYW5nZTogZnVuY3Rpb24gKHN0YXJ0Q29uLCBzdGFydE9mZiwgZW5kQ29uLCBlbmRPZmYpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBfZC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydENvbiwgc3RhcnRPZmYpO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoZW5kQ29uLCBlbmRPZmYpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gX3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICAgICAgICB0aGlzLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBlZGl0b3IncyByYW5nZSBvYmplY3RcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFJhbmdlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YXJpYWJsZS5fcmFuZ2UgfHwgdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldCBjdXJyZW50IHNlbGVjdCBub2RlXHJcbiAgICAgICAgICogQHJldHVybnMge05vZGV9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0U2VsZWN0aW9uTm9kZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFyaWFibGUuX3NlbGVjdGlvbk5vZGUgfHwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gU2F2aW5nIHRoZSByYW5nZSBvYmplY3QgYW5kIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbm9kZSBvZiBlZGl0b3JcclxuICAgICAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIF9lZGl0b3JSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgICAgICAgaWYgKCF1dGlsLmdldFBhcmVudEVsZW1lbnQoc2VsZWN0aW9uLmZvY3VzTm9kZSwgJy5zdW4tZWRpdG9yLWlkLXd5c2l3eWcnKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHJhbmdlID0gbnVsbDtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbk5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5fY3JlYXRlRGVmYXVsdFJhbmdlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9yYW5nZSA9IHJhbmdlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbi5leHRlbnROb2RlIHx8IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fc2VsZWN0aW9uTm9kZSA9IHNlbGVjdGlvbk5vZGU7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybiB0aGUgcmFuZ2Ugb2JqZWN0IG9mIGVkaXRvcidzIGZpcnN0IGNoaWxkIG5vZGVcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX2NyZWF0ZURlZmF1bHRSYW5nZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IF9kLmNyZWF0ZVJhbmdlKCk7XHJcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmZpcnN0Q2hpbGQsIDApO1xyXG4gICAgICAgICAgICByYW5nZS5zZXRFbmQoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuZmlyc3RDaGlsZCwgMCk7XHJcbiAgICAgICAgICAgIHJldHVybiByYW5nZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIFwiZm9ybWF0RWxlbWVudFwiKFAsIERJViwgSFsxLTZdLCBMSSkgYXJyYXkgZnJvbSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlLlxyXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuY2hpbGRyZW47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJhbmdlKGNoaWxkcmVuWzBdLCAwLCBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0udGV4dENvbnRlbnQubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUZvcm1hdEVsZW1lbnRzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikgJiYgIXV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFt1dGlsLmdldEZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKV07XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICBjb25zdCBsaW5lTm9kZXMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0Q29uID09PSBlbmRDb24pIHJldHVybiBsaW5lTm9kZXNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHN0YXJ0Q29uKTtcclxuICAgICAgICAgICAgbGV0IGVuZExpbmUgPSB1dGlsLmdldEZvcm1hdEVsZW1lbnQoZW5kQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SWR4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGVuZElkeCA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGluZU5vZGVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3RhcnRMaW5lID09PSBsaW5lTm9kZXNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gbGluZU5vZGVzW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpIDw9IGVuZElkeDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdEVsZW1lbnRzLnB1c2gobGluZU5vZGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBcInJhbmdlRm9ybWF0RWxlbWVudFwiKGJsb2NrcXVvdGUsIFRBQkxFLCBUUiwgVEQsIE9MLCBVTCwgUFJFKSBhcnJheSBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UuXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldFNlbGVjdGVkUmFuZ2VGb3JtYXRFbGVtZW50czogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodXRpbC5pc1d5c2l3eWdEaXYocmFuZ2Uuc3RhcnRDb250YWluZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmNoaWxkcmVuO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShjaGlsZHJlblswXSwgMCwgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0sIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnRleHRDb250ZW50Lmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRDb24gPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBjb21tb25Db24gPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VGb3JtYXRFbGVtZW50cyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKSkgcmV0dXJuIFtjb21tb25Db25dO1xyXG4gICAgICAgICAgICBpZiAoIXV0aWwuaXNXeXNpd3lnRGl2KGNvbW1vbkNvbikpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlbCA/IFtlbF0gOiBbXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gZ2V0IHJhbmdlIEVsZW1lbnRzXHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlRWxlbWVudHMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihjb21tb25Db24sIGZ1bmN0aW9uIChjdXJyZW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjdXJyZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc3RhcnRDb24gPT09IGVuZENvbikgcmV0dXJuIHJhbmdlRWxlbWVudHNbMF07XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnRMaW5lID0gdXRpbC5nZXRSYW5nZUZvcm1hdEVsZW1lbnQoc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kTGluZSA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVuZENvbik7XHJcbiAgICAgICAgICAgIGxldCBzdGFydElkeCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBlbmRJZHggPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdGFydExpbmUgPT09IHJhbmdlRWxlbWVudHNbaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZW5kTGluZSA9PT0gcmFuZ2VFbGVtZW50c1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZElkeCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA8PSBlbmRJZHg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlRWxlbWVudHNbaV0pIHJhbmdlRm9ybWF0RWxlbWVudHMucHVzaChyYW5nZUVsZW1lbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlRm9ybWF0RWxlbWVudHM7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERldGVybWluZSBpZiB0aGlzIG9mZnNldCBpcyB0aGUgZWRnZSBvZmZzZXQgb2YgY29udGFpbmVyXHJcbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRhaW5lciAtIFRoZSBjb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIFRoZSBvZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaXNFZGdlUG9pbnQ6IGZ1bmN0aW9uIChjb250YWluZXIsIG9mZnNldCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKG9mZnNldCA9PT0gMCkgfHwgKG9mZnNldCA9PT0gY29udGFpbmVyLm5vZGVWYWx1ZS5sZW5ndGgpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd0xvYWRpbmc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmxvYWRpbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGxvYWRpbmcgYm94XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5sb2FkaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFwcGVuZCBmb3JtYXQgZWxlbWVudCB0byBzaWJsaW5nIG5vZGUgb2YgYXJndW1lbnQgZWxlbWVudC5cclxuICAgICAgICAgKiBJZiB0aGUgXCJmb3JtYXROb2RlTmFtZVwiIGFyZ3VtZW50IHZhbHVlIGlzIHByZXNlbnQsIHRoZSB0YWcgb2YgdGhhdCBhcmd1bWVudCB2YWx1ZSBpcyBpbnNlcnRlZCxcclxuICAgICAgICAgKiBJZiBub3QsIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IHRhZyBpcyBpbnNlcnRlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBJbnNlcnQgYXMgc2libGluZ3Mgb2YgdGhhdCBlbGVtZW50XHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8bnVsbH0gZm9ybWF0Tm9kZU5hbWUgLSBOb2RlIG5hbWUgdG8gYmUgaW5zZXJ0ZWRcclxuICAgICAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAgICAgKi9cclxuICAgICAgICBhcHBlbmRGb3JtYXRUYWc6IGZ1bmN0aW9uIChlbGVtZW50LCBmb3JtYXROb2RlTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXRFbCA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGVsZW1lbnQpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChlbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEZvcm1hdEVsID0gdXRpbC5nZXRGb3JtYXRFbGVtZW50KHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKTtcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdE5hbWUgPSBmb3JtYXROb2RlTmFtZSA/IGZvcm1hdE5vZGVOYW1lIDogdXRpbC5pc0Zvcm1hdEVsZW1lbnQoY3VycmVudEZvcm1hdEVsKSA/IGN1cnJlbnRGb3JtYXRFbC5ub2RlTmFtZSA6ICdQJztcclxuICAgICAgICAgICAgY29uc3Qgb0Zvcm1hdCA9IHV0aWwuY3JlYXRlRWxlbWVudChvRm9ybWF0TmFtZSk7XHJcbiAgICAgICAgICAgIG9Gb3JtYXQuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzQ2VsbChmb3JtYXRFbCkpIGZvcm1hdEVsLmluc2VydEJlZm9yZShvRm9ybWF0LCBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgICAgIGVsc2UgZm9ybWF0RWwucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob0Zvcm1hdCwgZm9ybWF0RWwubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBvRm9ybWF0O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgc2VsZWN0ZWQgbm9kZSBhbmQgaW5zZXJ0IGFyZ3VtZW50IHZhbHVlIG5vZGVcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9Ob2RlIC0gTm9kZSB0byBiZSBpbnNlcnRlZFxyXG4gICAgICAgICAqIEBwYXJhbSB7KEVsZW1lbnR8bnVsbCl9IHJpZ2h0Tm9kZSAtIElmIHRoZSBub2RlIGV4aXN0cywgaXQgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpbnNlcnROb2RlOiBmdW5jdGlvbiAob05vZGUsIHJpZ2h0Tm9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0UmFuZ2UoKTtcclxuICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyaWdodE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kQ29uID0gcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kT2ZmID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uO1xyXG4gICAgICAgICAgICAgICAgaWYgKHN0YXJ0Q29uLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHN0YXJ0Q29uLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIE5vIFNlbGVjdCByYW5nZSBub2RlICovXHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1vbkNvbi5ub2RlVHlwZSA9PT0gMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodE5vZGUgPSBjb21tb25Db24uc3BsaXRUZXh0KGVuZE9mZik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5sYXN0Q2hpbGQgIT09IG51bGwgJiYgdXRpbC5pc0JyZWFrKHBhcmVudE5vZGUubGFzdENoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwYXJlbnROb2RlLmxhc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvKiogU2VsZWN0IHJhbmdlIG5vZGVzICovXHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1NhbWVDb250YWluZXIgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRWRnZVBvaW50KGVuZENvbiwgZW5kT2ZmKSkgcmlnaHROb2RlID0gZW5kQ29uLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHJpZ2h0Tm9kZSA9IGVuZENvbi5zcGxpdFRleHQoZW5kT2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdmVOb2RlID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VkZ2VQb2ludChzdGFydENvbiwgc3RhcnRPZmYpKSByZW1vdmVOb2RlID0gc3RhcnRDb24uc3BsaXRUZXh0KHN0YXJ0T2ZmKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocmVtb3ZlTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IGNvbW1vbkNvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHROb2RlID0gZW5kQ29uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJpZ2h0Tm9kZS5wYXJlbnROb2RlICE9PSBjb21tb25Db24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHJpZ2h0Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgcmlnaHROb2RlID0gcmlnaHROb2RlLm5leHRTaWJsaW5nO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUob05vZGUsIHJpZ2h0Tm9kZSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQob05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW1vdmVOb2RlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJhbmdlLmRlbGV0ZUNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGFydENvbiA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydE9mZiA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICBjb25zdCBlbmRDb24gPSByYW5nZS5lbmRDb250YWluZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHJhbmdlLmVuZE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgY29tbW9uQ29uID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXI7XHJcblxyXG4gICAgICAgICAgICBsZXQgYmVmb3JlTm9kZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBhZnRlck5vZGUgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHV0aWwuZ2V0TGlzdENoaWxkTm9kZXMoY29tbW9uQ29uKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2Rlcywgc3RhcnRDb24pO1xyXG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSB1dGlsLmdldEFycmF5SW5kZXgoY2hpbGROb2RlcywgZW5kQ29uKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4ICsgMSwgc3RhcnROb2RlID0gc3RhcnRDb247IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2Rlc1tpXSA9PT0gc3RhcnROb2RlLnBhcmVudE5vZGUgJiYgY2hpbGROb2Rlc1tpXS5maXJzdENoaWxkID09PSBzdGFydE5vZGUgJiYgc3RhcnRPZmYgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydE5vZGUgPSBzdGFydE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZEluZGV4IC0gMSwgZW5kTm9kZSA9IGVuZENvbjsgaSA+IHN0YXJ0SW5kZXg7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0gPT09IGVuZE5vZGUucGFyZW50Tm9kZSAmJiBjaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGROb2Rlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kTm9kZSA9IGVuZE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAtLWVuZEluZGV4O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY2hpbGROb2Rlc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5sZW5ndGggPT09IDAgfHwgKGl0ZW0ubm9kZVR5cGUgPT09IDMgJiYgaXRlbS5kYXRhID09PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09PSBzdGFydENvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoc3RhcnRDb24uc3Vic3RyaW5nRGF0YSgwLCBzdGFydE9mZikpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJlZm9yZU5vZGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbi5kYXRhID0gYmVmb3JlTm9kZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gZW5kQ29uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbi50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJOb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShlbmRDb24uc3Vic3RyaW5nRGF0YShlbmRPZmYsIChlbmRDb24ubGVuZ3RoIC0gZW5kT2ZmKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyTm9kZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbi5kYXRhID0gYWZ0ZXJOb2RlLmRhdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVuZENvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gYXBwZW5kZWQgYWxsIHNlbGVjdGVkIGZvcm1hdCBFbGVtZW50IHRvIHRoZSBhcmd1bWVudCBlbGVtZW50IGFuZCBpbnNlcnRcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHdyYXBUYWcgLSBFbGVtZW50IG9mIHdyYXAgdGhlIGFyZ3VtZW50c1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHdyYXBUb1RhZ3M6IGZ1bmN0aW9uICh3cmFwVGFnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICBjb25zdCByYW5nZUxpbmVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJhbmdlTGluZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyID0gdXRpbC5jcmVhdGVFbGVtZW50KHV0aWwuaXNDZWxsKHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpKSA/ICdESVYnIDogJ1AnKTtcclxuICAgICAgICAgICAgICAgIGlubmVyLmlubmVySFRNTCA9IHV0aWwuemVyb1dpZHRoU3BhY2U7XHJcbiAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGlubmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2VsZWN0aW9uTm9kZSgpLmFwcGVuZENoaWxkKHdyYXBUYWcpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbGFzdCAgPSByYW5nZUxpbmVzW3JhbmdlTGluZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIGxldCBzdGFuZFRhZywgYmVmb3JlVGFnLCBwRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICh1dGlsLmlzUmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuaXNGb3JtYXRFbGVtZW50KGxhc3QpKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IGxhc3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFuZFRhZyA9IHV0aWwuZ2V0UmFuZ2VGb3JtYXRFbGVtZW50KGxhc3QpIHx8IHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChsYXN0KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuaXNDZWxsKHN0YW5kVGFnKSkge1xyXG4gICAgICAgICAgICAgICAgYmVmb3JlVGFnID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmVUYWcgPSBzdGFuZFRhZy5uZXh0U2libGluZztcclxuICAgICAgICAgICAgICAgIHBFbGVtZW50ID0gc3RhbmRUYWcucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGxpc3RQYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgbGluZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBwcmV2Tm9kZU5hbWUgPSAnJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSByYW5nZUxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsaW5lID0gcmFuZ2VMaW5lc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoL15MSSQvaS50ZXN0KGxpbmUubm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RQYXJlbnQgPT09IG51bGwgfHwgIS9eTEkkL2kudGVzdChwcmV2Tm9kZU5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQgPSB1dGlsLmNyZWF0ZUVsZW1lbnQobGluZS5wYXJlbnROb2RlLm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxpc3RQYXJlbnQuYXBwZW5kQ2hpbGQobGluZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEgfHwgIS9eTEkkL2kudGVzdChyYW5nZUxpbmVzW2kgKyAxXS5ub2RlTmFtZSkpIHdyYXBUYWcuYXBwZW5kQ2hpbGQobGlzdFBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB3cmFwVGFnLmFwcGVuZENoaWxkKGxpbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHByZXZOb2RlTmFtZSA9IGxpbmUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHBFbGVtZW50Lmluc2VydEJlZm9yZSh3cmFwVGFnLCBiZWZvcmVUYWcpO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCAmJiAodXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5zdGFydENvbnRhaW5lcikgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChyYW5nZS5lbmRDb250YWluZXIpKSkgdXRpbC5yZW1vdmVFbXB0eU5vZGUocEVsZW1lbnQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgdGhlIG5vZGUgcmVjZWl2ZWQgYXMgYW4gYXJndW1lbnQgdmFsdWUgdG8gdGhlIHNlbGVjdGVkIGFyZWEuXHJcbiAgICAgICAgICogMS4gV2hlbiB0aGVyZSBpcyB0aGUgc2FtZSBjc3MgdmFsdWUgbm9kZSBpbiB0aGUgc2VsZWN0aW9uIGFyZWEsIHRoZSB0YWcgaXMgc3RyaXBwZWQuXHJcbiAgICAgICAgICogMi4gSWYgdGhlcmUgaXMgYW5vdGhlciBjc3MgdmFsdWUgb3RoZXIgdGhhbkNzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50cyBvbiB0aGUgbm9kZSwgcmVtb3ZlZCBvbmx5IENzcyBhdHRyaWJ1dGUgdmFsdWVzIHJlY2VpdmVkIGFzIGFyZ3VtZW50c1xyXG4gICAgICAgICAqIDMuIElmIHlvdSBwYXNzIGFuIGVsZW1lbnQgd2hvc2Ugbm9kZSBuYW1lIGlzIFwicmVtb3Zlbm9kZVwiIGFzIGFuIGFyZ3VtZW50IHZhbHVlLCBpdCBwZXJmb3JtcyBhIHR5cGUgcmVtb3ZhbCBvcGVyYXRpb24uIGV4KSBub2RlQ2hhbmdlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlbW92ZW5vZGUnKSlcclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFwcGVuZE5vZGUgLSBUaGUgZG9tIHRoYXQgd2lsbCB3cmFwIHRoZSBzZWxlY3RlZCB0ZXh0IGFyZWFcclxuICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBjaGVja0NTU1Byb3BlcnR5QXJyYXkgLSBUaGUgY3NzIGF0dHJpYnV0ZSBuYW1lIEFycmF5IHRvIGNoZWNrIChbJ2ZvbnQtc2l6ZSddLCBbJ2ZvbnQtZmFtaWx5JywgJ2JhY2tncm91bmQtY29sb3InLCAnYm9yZGVyJ10uLi5dKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vZGVDaGFuZ2U6IGZ1bmN0aW9uIChhcHBlbmROb2RlLCBjaGVja0NTU1Byb3BlcnR5QXJyYXkpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzUmVtb3ZlRm9ybWF0ID0gL3JlbW92ZW5vZGUvaS50ZXN0KGFwcGVuZE5vZGUubm9kZU5hbWUpO1xyXG4gICAgICAgICAgICBsZXQgdGVtcENvbiwgdGVtcE9mZnNldCwgdGVtcENoaWxkLCB0ZW1wQXJyYXk7XHJcblxyXG4gICAgICAgICAgICAvKiBjaGVja2VkIHNhbWUgc3R5bGUgcHJvcGVydHkgKi9cclxuICAgICAgICAgICAgaWYgKHJhbmdlLnN0YXJ0Q29udGFpbmVyID09PSByYW5nZS5lbmRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWwuZ2V0Rm9ybWF0RWxlbWVudChzTm9kZSkgPT09IHNOb2RlLnBhcmVudE5vZGUpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ250ID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIXV0aWwuaXNGb3JtYXRFbGVtZW50KHNOb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYoc05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc05vZGUubm9kZVR5cGUgPT09IDEgJiYgc05vZGUuc3R5bGVbY2hlY2tDU1NQcm9wZXJ0eUFycmF5W2ldXSA9PT0gYXBwZW5kTm9kZS5zdHlsZVtjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV1dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDbnQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNOb2RlID0gc05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NudCA+PSBjaGVja0NTU1Byb3BlcnR5QXJyYXkubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qIGZpbmQgdGV4dCBub2RlICovXHJcbiAgICAgICAgICAgIC8vIHN0YXJ0Q29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5zdGFydENvbnRhaW5lcikgPyBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5maXJzdENoaWxkIDogcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICAgICAgICAgIHRlbXBPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZW1wQ29uLm5vZGVUeXBlID09PSAxICYmIHRlbXBDb24uY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAodGVtcENvbiAmJiAhdXRpbC5pc0JyZWFrKHRlbXBDb24pICYmIHRlbXBDb24ubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ2hpbGQgPSB0ZW1wQ29uLmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRlbXBDaGlsZC5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQXJyYXkucHVzaCh0ZW1wQ2hpbGRbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0ZW1wQ29uID0gdGVtcEFycmF5W3RlbXBPZmZzZXRdIHx8IHRlbXBDb24ubmV4dEVsZW1lbnRTaWJsaW5nIHx8IHRlbXBDb24ubmV4dFNpYmxpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0Q29uID0gdGVtcENvbjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRPZmYgPSB0ZW1wT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgIHRlbXBDb24gPSB1dGlsLmlzV3lzaXd5Z0RpdihyYW5nZS5lbmRDb250YWluZXIpID8gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcubGFzdENoaWxkIDogcmFuZ2UuZW5kQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gcmFuZ2UuZW5kT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlbXBDb24ubm9kZVR5cGUgPT09IDEgJiYgdGVtcENvbi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHdoaWxlICh0ZW1wQ29uICYmICF1dGlsLmlzQnJlYWsodGVtcENvbikgJiYgdGVtcENvbi5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDaGlsZCA9IHRlbXBDb24uY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGVtcENoaWxkLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBBcnJheS5wdXNoKHRlbXBDaGlsZFtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSB0ZW1wQXJyYXlbdGVtcE9mZnNldCAtIDFdIHx8ICEvRklHVVJFL2kudGVzdCh0ZW1wQXJyYXlbMF0ubm9kZU5hbWUpID8gdGVtcEFycmF5WzBdIDogKHRlbXBDb24ucHJldmlvdXNFbGVtZW50U2libGluZyB8fCB0ZW1wQ29uLnByZXZpb3VzU2libGluZyB8fCBzdGFydENvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0ZW1wT2Zmc2V0ID0gdGVtcENvbi50ZXh0Q29udGVudC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHV0aWwuaXNCcmVhayh0ZW1wQ29uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtcHR5VGV4dCA9IHV0aWwuY3JlYXRlVGV4dE5vZGUodXRpbC56ZXJvV2lkdGhTcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcENvbi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlbXB0eVRleHQsIHRlbXBDb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBDb24gPSBlbXB0eVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGVuZENvbiA9IHRlbXBDb247XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mZiA9IHRlbXBPZmZzZXQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1vbkNvbiA9IHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdOb2RlTmFtZSA9IGFwcGVuZE5vZGUubm9kZU5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0UmFuZ2Uoc3RhcnRDb24sIHN0YXJ0T2ZmLCBlbmRDb24sIGVuZE9mZik7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB7fSwgZW5kID0ge307XHJcbiAgICAgICAgICAgIGxldCBuZXdOb2RlLCByZWdFeHA7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2hlY2tDU1NQcm9wZXJ0eUFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgPSAnKD86O3xefFxcXFxzKSg/OicgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbMF07XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGNoZWNrQ1NTUHJvcGVydHlBcnJheS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZ0V4cCArPSAnfCcgKyBjaGVja0NTU1Byb3BlcnR5QXJyYXlbaV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZWdFeHAgKz0gJylcXFxccyo6W147XSpcXFxccyooPzo7fCQpJztcclxuICAgICAgICAgICAgICAgIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVnRXhwLCAnaWcnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHRhZyBjaGVjayBmdW5jdGlvbiovXHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrQ3NzID0gZnVuY3Rpb24gKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQgfHwgdk5vZGUubm9kZVR5cGUgPT09IDMgfHwgdXRpbC5pc0JyZWFrKHZOb2RlKSkgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gdk5vZGUuc3R5bGUuY3NzVGV4dC5yZXBsYWNlKHJlZ0V4cCwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUubGVuZ3RoID4gMCB8fCB2Tm9kZS5ub2RlTmFtZSAhPT0gbmV3Tm9kZU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodk5vZGUuc3R5bGUuY3NzVGV4dC5sZW5ndGggPiAwKSB2Tm9kZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgLyoqIG9uZSBsaW5lICovXHJcbiAgICAgICAgICAgIGlmICghdXRpbC5pc1d5c2l3eWdEaXYoY29tbW9uQ29uKSAmJiAhdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChjb21tb25Db24pKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLl9ub2RlQ2hhbmdlX29uZUxpbmUodXRpbC5nZXRGb3JtYXRFbGVtZW50KGNvbW1vbkNvbiksIG5ld05vZGUsIGNoZWNrQ3NzLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgcmFuZ2UuY29sbGFwc2VkKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFydC5jb250YWluZXIgPSBuZXdSYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIHN0YXJ0Lm9mZnNldCA9IG5ld1JhbmdlLnN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgZW5kLmNvbnRhaW5lciA9IG5ld1JhbmdlLmVuZENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIGVuZC5vZmZzZXQgPSBuZXdSYW5nZS5lbmRPZmZzZXQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyoqIG11bHRpIGxpbmUgKi9cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgbGluZSBub2Rlc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGluZU5vZGVzID0gdGhpcy5nZXRTZWxlY3RlZEZvcm1hdEVsZW1lbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRMZW5ndGggPSBsaW5lTm9kZXMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzdGFydENvblxyXG4gICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbm9kZUNoYW5nZV9zdGFydExpbmUobGluZU5vZGVzWzBdLCBuZXdOb2RlLCBjaGVja0Nzcywgc3RhcnRDb24sIHN0YXJ0T2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGVuZExlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGFwcGVuZE5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub2RlQ2hhbmdlX21pZGRsZUxpbmUobGluZU5vZGVzW2ldLCBuZXdOb2RlLCBjaGVja0NzcywgaXNSZW1vdmVGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIGVuZENvblxyXG4gICAgICAgICAgICAgICAgaWYgKGVuZExlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gYXBwZW5kTm9kZS5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX25vZGVDaGFuZ2VfZW5kTGluZShsaW5lTm9kZXNbZW5kTGVuZ3RoXSwgbmV3Tm9kZSwgY2hlY2tDc3MsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgcmFuZ2VcclxuICAgICAgICAgICAgdGhpcy5zZXRSYW5nZShzdGFydC5jb250YWluZXIsIHN0YXJ0Lm9mZnNldCwgZW5kLmNvbnRhaW5lciwgZW5kLm9mZnNldCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIHdyYXBzIHRleHQgbm9kZXMgb2YgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbmRDb24gLSBUaGUgZW5kQ29udGFpbmVyIHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBlbmRPZmYgLSBUaGUgZW5kT2Zmc2V0IHByb3BlcnR5IG9mIHRoZSBzZWxlY3Rpb24gb2JqZWN0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNSZW1vdmVGb3JtYXQgLSBJcyB0aGUgcmVtb3ZlIGZvcm1hdCBjb21tYW5kID9cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGNvbGxhcHNlZCAtIHJhbmdlLmNvbGxhcHNlZFxyXG4gICAgICAgICAqIEByZXR1cm5zIHt7c3RhcnRDb250YWluZXI6ICosIHN0YXJ0T2Zmc2V0OiAqLCBlbmRDb250YWluZXI6ICosIGVuZE9mZnNldDogKn19XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9vbmVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGVuZENvbiwgZW5kT2ZmLCBpc1JlbW92ZUZvcm1hdCwgY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2FtZU5vZGUgPSBzdGFydENvbiA9PT0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRDb250YWluZXIgPSBzdGFydENvbjtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmY7XHJcbiAgICAgICAgICAgIGxldCBlbmRDb250YWluZXIgPSBlbmRDb247XHJcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBlbmRPZmY7XHJcbiAgICAgICAgICAgIGxldCBzdGFydFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGVuZFBhc3MgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlLCBjc3NUZXh0O1xyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tDc3MgKHZOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWdFeHAgPSBuZXcgUmVnRXhwKCcoPzo7fF58XFxcXHMpKD86JyArIGNzc1RleHQgKyAnbnVsbClcXFxccyo6W147XSpcXFxccyooPzo7fCQpJywgJ2lnJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVnRXhwICYmIHZOb2RlLnN0eWxlLmNzc1RleHQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlID0gcmVnRXhwLnRlc3Qodk5vZGUuc3R5bGUuY3NzVGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICFzdHlsZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0UGFzcyAmJiBjaGlsZCA9PT0gc3RhcnRDb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHN0YXJ0Q29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBzdGFydENvbnRhaW5lci5zdWJzdHJpbmdEYXRhKDAsIHN0YXJ0T2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShzdGFydENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogc3RhcnRDb250YWluZXIuc3Vic3RyaW5nRGF0YShzdGFydE9mZnNldCwgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0ID8gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQgOiBzdGFydE9mZnNldCAtIGVuZE9mZnNldCkpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQocHJldk5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKG5ld05vZGUpICYmIG5ld05vZGUubm9kZVR5cGUgPT09IDEgJiYgY2hlY2tDc3MobmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dCArPSBuZXdOb2RlLnN0eWxlLmNzc1RleHQuc3Vic3RyKDAsIG5ld05vZGUuc3R5bGUuY3NzVGV4dC5pbmRleE9mKCc6JykpICsgJ3wnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQYXNzID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlICE9PSB0ZXh0Tm9kZSkgbmV3Tm9kZS5hcHBlbmRDaGlsZChzdGFydENvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTYW1lTm9kZSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBlbmRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MgJiYgY2hpbGQgPT09IGVuZENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZnRlck5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGVuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogZW5kQ29udGFpbmVyLnN1YnN0cmluZ0RhdGEoZW5kT2Zmc2V0LCAoZW5kQ29udGFpbmVyLmxlbmd0aCAtIGVuZE9mZnNldCkpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGlzU2FtZU5vZGUgfHwgZW5kQ29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBlbmRDb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBlbmRPZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUgIT09IHBOb2RlICYmIG5ld05vZGUgIT09IGVsICYmIG5ld05vZGUgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IGFmdGVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUudGV4dENvbnRlbnQgPSBhZnRlck5vZGUuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIGNoZWNrQ3NzKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzc1RleHQgKz0gbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LnN1YnN0cigwLCBuZXdOb2RlLnN0eWxlLmNzc1RleHQuaW5kZXhPZignOicpKSArICd8JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRDb250YWluZXIgPSB0ZXh0Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2Zmc2V0ID0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBhc3MgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JlbW92ZUZvcm1hdCAmJiBjb2xsYXBzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dE5vZGUudGV4dENvbnRlbnQgPSB1dGlsLnplcm9XaWR0aFNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZSAhPT0gdGV4dE5vZGUpIG5ld05vZGUuYXBwZW5kQ2hpbGQoZW5kQ29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlclxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBhc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGNoaWxkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSAmJiAoZW5kUGFzcyB8fCB2YWxpZGF0aW9uKG5ld05vZGUpKSAmJiBjaGVja0NzcyhuZXdOb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NUZXh0ICs9IG5ld05vZGUuc3R5bGUuY3NzVGV4dC5zdWJzdHIoMCwgbmV3Tm9kZS5zdHlsZS5jc3NUZXh0LmluZGV4T2YoJzonKSkgKyAnfCc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBwQ3VycmVudC5wb3AoKSB8fCBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgPT09IGNoaWxkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVuZFBhc3MpIG5vZGUgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG5vZGUgPSBwTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRQYXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjbG9uZU5vZGUgPSBjaGlsZC5jbG9uZU5vZGUoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY292ZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkoZWxlbWVudCwgcE5vZGUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydENvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29sbGFwc2VkID8gdXRpbC56ZXJvV2lkdGhTcGFjZSA6IG5ld0lubmVyTm9kZS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5pbnNlcnRCZWZvcmUoc3RhcnRDb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbGxhcHNlZCkgc3RhcnRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXIgPSBlbmRDb250YWluZXIgPSBuZXdJbm5lck5vZGU7XHJcbiAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRDb250YWluZXI6IHN0YXJ0Q29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgZW5kQ29udGFpbmVyOiBpc1JlbW92ZUZvcm1hdCB8fCAhZW5kQ29udGFpbmVyLnRleHRDb250ZW50ID8gc3RhcnRDb250YWluZXIgOiBlbmRDb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBlbmRPZmZzZXQ6IGlzUmVtb3ZlRm9ybWF0IHx8ICFlbmRDb250YWluZXIudGV4dENvbnRlbnQgPyBzdGFydENvbnRhaW5lci50ZXh0Q29udGVudC5sZW5ndGggOiBlbmRPZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbWlkIGxpbmVzIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVtb3ZlRm9ybWF0IC0gSXMgdGhlIHJlbW92ZSBmb3JtYXQgY29tbWFuZCA/XHJcbiAgICAgICAgICogQHByaXZhdGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBfbm9kZUNoYW5nZV9taWRkbGVMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoZWxlbWVudC50ZXh0Q29udGVudCA/IGVsZW1lbnQudGV4dENvbnRlbnQgOiB1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gY3VycmVudC5jaGlsZE5vZGVzO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW9uKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNsb25lTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pKGVsZW1lbnQsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgZmlyc3QgbGluZSBzZWxlY3RlZCB0ZXh0LlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIFRoZSBub2RlIG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHRleHQgbm9kZS5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5ld0lubmVyTm9kZSAtIFRoZSBkb20gdGhhdCB3aWxsIHdyYXAgdGhlIHNlbGVjdGVkIHRleHQgYXJlYVxyXG4gICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRpb24gLSBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzdGFydENvbiAtIFRoZSBzdGFydENvbnRhaW5lciBwcm9wZXJ0eSBvZiB0aGUgc2VsZWN0aW9uIG9iamVjdC5cclxuICAgICAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRPZmYgLSBUaGUgc3RhcnRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2Vfc3RhcnRMaW5lOiBmdW5jdGlvbiAoZWxlbWVudCwgbmV3SW5uZXJOb2RlLCB2YWxpZGF0aW9uLCBzdGFydENvbiwgc3RhcnRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gc3RhcnRDb247XHJcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSBzdGFydE9mZjtcclxuICAgICAgICAgICAgbGV0IHBhc3NOb2RlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBwQ3VycmVudCwgbmV3Tm9kZSwgYXBwZW5kTm9kZTtcclxuXHJcbiAgICAgICAgICAgIChmdW5jdGlvbiByZWN1cnNpb25GdW5jKGN1cnJlbnQsIG5vZGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBjdXJyZW50LmNoaWxkTm9kZXM7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGROb2Rlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY292ZXJOb2RlID0gbm9kZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NOb2RlICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9uRnVuYyhjaGlsZCwgY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBjaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld05vZGUucGFyZW50Tm9kZSAhPT0gbnVsbCAmJiBuZXdOb2RlICE9PSBlbCAmJiBuZXdOb2RlICE9PSBuZXdJbm5lck5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlLm5vZGVUeXBlID09PSAxICYmIHZhbGlkYXRpb24obmV3Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudC5wdXNoKG5ld05vZGUuY2xvbmVOb2RlKGZhbHNlKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlID0gbmV3Tm9kZSA9IGNoaWxkTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuYXBwZW5kQ2hpbGQoY2hpbGROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRDb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlICYmIGNoaWxkID09PSBjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldk5vZGUgPSB1dGlsLmNyZWF0ZVRleHROb2RlKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSA/ICcnIDogY29udGFpbmVyLnN1YnN0cmluZ0RhdGEoMCwgb2Zmc2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShjb250YWluZXIubm9kZVR5cGUgPT09IDEgPyAnJyA6IGNvbnRhaW5lci5zdWJzdHJpbmdEYXRhKG9mZnNldCwgKGNvbnRhaW5lci5sZW5ndGggLSBvZmZzZXQpKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKHByZXZOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlICE9PSBwTm9kZSAmJiBuZXdOb2RlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSAmJiB2YWxpZGF0aW9uKG5ld05vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gcEN1cnJlbnQucG9wKCkgfHwgbm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwQ3VycmVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gcEN1cnJlbnQucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUgIT09IG5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lubmVyTm9kZS5hcHBlbmRDaGlsZChjaGlsZE5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuYXBwZW5kQ2hpbGQobmV3SW5uZXJOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdGV4dE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NOb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NOb2RlIHx8IHZhbGlkYXRpb24oY2hpbGQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lTm9kZSA9IGNoaWxkLmNsb25lTm9kZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoY2xvbmVOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxICYmICF1dGlsLmlzQnJlYWsoY2hpbGQpKSBjb3Zlck5vZGUgPSBjbG9uZU5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpb25GdW5jKGNoaWxkLCBjb3Zlck5vZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KShlbGVtZW50LCBwTm9kZSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNSZW1vdmVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHV0aWwuY3JlYXRlVGV4dE5vZGUobmV3SW5uZXJOb2RlLnRleHRDb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGVsZW1lbnQuY2hpbGROb2Rlc1swXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZSh1dGlsLnplcm9XaWR0aFNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUVtcHR5Tm9kZShwTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHBOb2RlLCBlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlSXRlbShlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gd3JhcHMgbGFzdCBsaW5lIHNlbGVjdGVkIHRleHQuXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gVGhlIG5vZGUgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgdGV4dCBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbmV3SW5uZXJOb2RlIC0gVGhlIGRvbSB0aGF0IHdpbGwgd3JhcCB0aGUgc2VsZWN0ZWQgdGV4dCBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gdmFsaWRhdGlvbiAtIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBzdHJpcHBlZC5cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVuZENvbiAtIFRoZSBlbmRDb250YWluZXIgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtOdW1iZXJ9IGVuZE9mZiAtIFRoZSBlbmRPZmZzZXQgcHJvcGVydHkgb2YgdGhlIHNlbGVjdGlvbiBvYmplY3QuXHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlbW92ZUZvcm1hdCAtIElzIHRoZSByZW1vdmUgZm9ybWF0IGNvbW1hbmQgP1xyXG4gICAgICAgICAqIEByZXR1cm5zIHt7Y29udGFpbmVyOiAqLCBvZmZzZXQ6ICp9fVxyXG4gICAgICAgICAqIEBwcml2YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgX25vZGVDaGFuZ2VfZW5kTGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG5ld0lubmVyTm9kZSwgdmFsaWRhdGlvbiwgZW5kQ29uLCBlbmRPZmYsIGlzUmVtb3ZlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcE5vZGUgPSBlbGVtZW50LmNsb25lTm9kZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZW5kQ29uO1xyXG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gZW5kT2ZmO1xyXG4gICAgICAgICAgICBsZXQgcGFzc05vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHBDdXJyZW50LCBuZXdOb2RlLCBhcHBlbmROb2RlO1xyXG5cclxuICAgICAgICAgICAgKGZ1bmN0aW9uIHJlY3Vyc2lvbkZ1bmMoY3VycmVudCwgbm9kZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IGN1cnJlbnQuY2hpbGROb2RlcztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjaGlsZE5vZGVzLmxlbmd0aCAtMTsgMCA8PSBpOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkTm9kZXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdmVyTm9kZSA9IG5vZGU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzTm9kZSAmJiAhdXRpbC5pc0JyZWFrKGNoaWxkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb2RlID0gY2hpbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50ID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXdOb2RlLnBhcmVudE5vZGUgIT09IG51bGwgJiYgbmV3Tm9kZSAhPT0gZWwgJiYgbmV3Tm9kZSAhPT0gbmV3SW5uZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbihuZXdOb2RlKSAmJiBuZXdOb2RlLm5vZGVUeXBlID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN1cnJlbnQucHVzaChuZXdOb2RlLmNsb25lTm9kZShmYWxzZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBDdXJyZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZSA9IG5ld05vZGUgPSBjaGlsZE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBwQ3VycmVudC5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmROb2RlLmFwcGVuZENoaWxkKG5ld05vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5uZXJOb2RlLmluc2VydEJlZm9yZShjaGlsZE5vZGUsIG5ld0lubmVyTm9kZS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld0lubmVyTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kQ29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzTm9kZSAmJiBjaGlsZCA9PT0gY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyTm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YShvZmZzZXQsIChjb250YWluZXIubGVuZ3RoIC0gb2Zmc2V0KSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IHV0aWwuY3JlYXRlVGV4dE5vZGUoY29udGFpbmVyLm5vZGVUeXBlID09PSAxID8gJycgOiBjb250YWluZXIuc3Vic3RyaW5nRGF0YSgwLCBvZmZzZXQpKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlck5vZGUuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmluc2VydEJlZm9yZShhZnRlck5vZGUsIG5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQ3VycmVudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmV3Tm9kZSAhPT0gcE5vZGUgJiYgbmV3Tm9kZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24obmV3Tm9kZSkgJiYgbmV3Tm9kZS5ub2RlVHlwZSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdXJyZW50LnB1c2gobmV3Tm9kZS5jbG9uZU5vZGUoZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBDdXJyZW50LnBvcCgpIHx8IG5vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlID0gY2hpbGROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocEN1cnJlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZSA9IHBDdXJyZW50LnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTm9kZS5hcHBlbmRDaGlsZChuZXdOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZE5vZGUgPSBuZXdOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlICE9PSBub2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbm5lck5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgbmV3SW5uZXJOb2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ld05vZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV3SW5uZXJOb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0JyZWFrKGNoaWxkKSkgbmV3SW5uZXJOb2RlLmFwcGVuZENoaWxkKGNoaWxkLmNsb25lTm9kZShmYWxzZSkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0lubmVyTm9kZSwgcE5vZGUuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHRleHROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSB0ZXh0Tm9kZS5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc05vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc05vZGUgfHwgdmFsaWRhdGlvbihjaGlsZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xvbmVOb2RlID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5pbnNlcnRCZWZvcmUoY2xvbmVOb2RlLCBub2RlLmZpcnN0Q2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEgJiYgIXV0aWwuaXNCcmVhayhjaGlsZCkpIGNvdmVyTm9kZSA9IGNsb25lTm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvbkZ1bmMoY2hpbGQsIGNvdmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKGVsZW1lbnQsIHBOb2RlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc1JlbW92ZUZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyID0gdXRpbC5jcmVhdGVUZXh0Tm9kZShuZXdJbm5lck5vZGUudGV4dENvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gY29udGFpbmVyLnRleHRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgIHBOb2RlLmluc2VydEJlZm9yZShjb250YWluZXIsIG5ld0lubmVyTm9kZSk7XHJcbiAgICAgICAgICAgICAgICBwTm9kZS5yZW1vdmVDaGlsZChuZXdJbm5lck5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzUmVtb3ZlRm9ybWF0ICYmIHBOb2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyID0gZWxlbWVudC5jaGlsZE5vZGVzWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSB1dGlsLmNyZWF0ZVRleHROb2RlKHV0aWwuemVyb1dpZHRoU3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlRW1wdHlOb2RlKHBOb2RlKTtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocE5vZGUsIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXHJcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IG9mZnNldFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGNvbW1hbmQgb2YgY29tbWFuZCBidXR0b24oQWxsIEJ1dHRvbnMgZXhjZXB0IHN1Ym1lbnUgYW5kIGRpYWxvZylcclxuICAgICAgICAgKiAocmVkbywgdW5kbywgYm9sZCwgdW5kZXJsaW5lLCBpdGFsaWMsIHN0cmlrZXRocm91Z2gsIHN1YnNjcmlwdCwgc3VwZXJzY3JpcHQsIHJlbW92ZUZvcm1hdCwgaW5kZW50LCBvdXRkZW50LCBmdWxsc2NyZWVuLCBzaG93QmxvY2tzLCBjb2RldmlldywgcHJldmlldywgcHJpbnQpXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgLSBUaGUgZWxlbWVudCBvZiBjb21tYW5kIGJ1dHRvblxyXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb21tYW5kIC0gUHJvcGVydHkgb2YgY29tbWFuZCBidXR0b24gKGRhdGEtdmFsdWUpXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29tbWFuZEhhbmRsZXI6IGZ1bmN0aW9uICh0YXJnZXQsIGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlVmlldyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQ29kZVZpZXcoKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKHRhcmdldCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdmdWxsU2NyZWVuJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVGdWxsU2NyZWVuKHRhcmdldCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW5kZW50JzpcclxuICAgICAgICAgICAgICAgIGNhc2UgJ291dGRlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50KGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAncmVkbyc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRvJzpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW92ZUZvcm1hdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAncHJpbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbldpbmRvd0NvbnRlbnRzKGNvbW1hbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc2hvd0Jsb2Nrcyc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVEaXNwbGF5QmxvY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyh0YXJnZXQsICdvbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3Vic2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3VwZXJzY3JpcHQsICdvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoJ3N1cGVyc2NyaXB0JywgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQudG9vbC5zdXBlcnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N1cGVyc2NyaXB0JzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5oYXNDbGFzcyhjb250ZXh0LnRvb2wuc3Vic2NyaXB0LCAnb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKCdzdWJzY3JpcHQnLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC50b29sLnN1YnNjcmlwdCwgJ29uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiAvLyAnYm9sZCcsICd1bmRlcmxpbmUnLCAnaXRhbGljJywgJ3N0cmlrZSdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXZhbHVlJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwudG9nZ2xlQ2xhc3ModGFyZ2V0LCAnb24nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgZm9ybWF0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UgKElFLCBFZGdlIG5vdCB3b3JraW5nKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlbW92ZUZvcm1hdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVDaGFuZ2UodXRpbC5jcmVhdGVFbGVtZW50KCdSRU1PVkVOT0RFJykpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIGluZGVudGF0aW9uIHRvIHNlbGVjdGVkIHJhbmdlLlxyXG4gICAgICAgICAqIFNldHRlZCBcIm1hcmdpbi1sZWZ0XCIgdG8gXCIyNXB4XCIgaW4gdGhlIHRvcCBcIlBcIiB0YWcgb2YgdGhlIHBhcmFtZXRlciBub2RlLlxyXG4gICAgICAgICAqIEBwYXJhbSBjb21tYW5kIHtTdHJpbmd9IC0gU2VwYXJhdG9yIChcImluZGVudFwiIG9yIFwib3V0ZGVudFwiKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluZGVudDogZnVuY3Rpb24gKGNvbW1hbmQpIHtcclxuICAgICAgICAgICAgY29uc3QgcmFuZ2VMaW5lcyA9IHRoaXMuZ2V0U2VsZWN0ZWRGb3JtYXRFbGVtZW50cygpO1xyXG4gICAgICAgICAgICBsZXQgcCwgbWFyZ2luO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJhbmdlTGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHAgPSByYW5nZUxpbmVzW2ldO1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luID0gL1xcZCsvLnRlc3QocC5zdHlsZS5tYXJnaW5MZWZ0KSA/IHAuc3R5bGUubWFyZ2luTGVmdC5tYXRjaCgvXFxkKy8pWzBdICogMSA6IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCdpbmRlbnQnID09PSBjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luICs9IDI1O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW4gLT0gMjU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHAuc3R5bGUubWFyZ2luTGVmdCA9IChtYXJnaW4gPCAwID8gMCA6IG1hcmdpbikgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEFkZCBvciByZW1vdmUgdGhlIGNsYXNzIG5hbWUgb2YgXCJib2R5XCIgc28gdGhhdCB0aGUgY29kZSBibG9jayBpcyB2aXNpYmxlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdG9nZ2xlRGlzcGxheUJsb2NrczogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB1dGlsLnRvZ2dsZUNsYXNzKGNvbnRleHQuZWxlbWVudC53eXNpd3lnLCAnc3VuLWVkaXRvci1zaG93LWJsb2NrJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENoYW5nZXMgdG8gY29kZSB2aWV3IG9yIHd5c2l3eWcgdmlld1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUNvZGVWaWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHd5c2l3eWdBY3RpdmUgPSB0aGlzLl92YXJpYWJsZS53eXNpd3lnQWN0aXZlO1xyXG4gICAgICAgICAgICBjb25zdCBkaXNCdXR0b25zID0gdGhpcy5jb2RlVmlld0Rpc2FibGVkQnV0dG9ucztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGRpc0J1dHRvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGRpc0J1dHRvbnNbaV0uZGlzYWJsZWQgPSB3eXNpd3lnQWN0aXZlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIXd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVfaHRtbCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCA9IGNvZGVfaHRtbC5sZW5ndGggPiAwID8gdXRpbC5jb252ZXJ0Q29udGVudHNGb3JFZGl0b3IoY29kZV9odG1sKSA6ICc8cD4nICsgdXRpbC56ZXJvV2lkdGhTcGFjZSArICc8L3A+JztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5vcHRpb24uaGVpZ2h0ID09PSAnYXV0bycpIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9ICcwcHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSA9IHV0aWwuY29udmVydEhUTUxGb3JDb2RlVmlldyhjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5pbm5lckhUTUwudHJpbSgpKTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5oZWlnaHQgPT09ICdhdXRvJykgY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuaGVpZ2h0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc2Nyb2xsSGVpZ2h0ID4gMCA/IChjb250ZXh0LmVsZW1lbnQuY29kZS5zY3JvbGxIZWlnaHQgKyAncHgnKSA6ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2hhbmdlcyB0byBmdWxsIHNjcmVlbiBvciBkZWZhdWx0IHNjcmVlblxyXG4gICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIGZ1bGwgc2NyZWVuIGJ1dHRvblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRvZ2dsZUZ1bGxTY3JlZW46IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdmFyaWFibGUuaXNGdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnRvcCA9ICcwJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9wQXJlYS5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLnpJbmRleCA9ICcyMTQ3NDgzNjQ3JztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fYm9keU92ZXJmbG93ID0gX2QuYm9keS5zdHlsZS5vdmVyZmxvdztcclxuICAgICAgICAgICAgICAgIF9kLmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl92YXJpYWJsZS5fZWRpdG9yQXJlYU9yaWdpbkNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5jc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuX3d5c2l3eWdPcmlnaW5Dc3NUZXh0ID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLl9jb2RlT3JpZ2luQ3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmNzc1RleHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dCA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyLnN0eWxlLmNzc1RleHQgPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0ID0gY29udGV4dC5lbGVtZW50LmNvZGUuc3R5bGUuY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUud2lkdGggPSBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5oZWlnaHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmFyaWFibGUuaW5uZXJIZWlnaHRfZnVsbFNjcmVlbiA9IChfdy5pbm5lckhlaWdodCAtIGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldEhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5oZWlnaHQgPSB0aGlzLl92YXJpYWJsZS5pbm5lckhlaWdodF9mdWxsU2NyZWVuICsgJ3B4JztcclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLWV4cGFuc2lvbicpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1yZWR1Y3Rpb24nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fY29kZU9yaWdpbkNzc1RleHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5jc3NUZXh0ID0gdGhpcy5fdmFyaWFibGUuX3d5c2l3eWdPcmlnaW5Dc3NUZXh0O1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUuY3NzVGV4dCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmVkaXRvckFyZWEuc3R5bGUuY3NzVGV4dCA9IHRoaXMuX3ZhcmlhYmxlLl9lZGl0b3JBcmVhT3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmNzc1RleHQgPSB0aGlzLl92YXJpYWJsZS5fb3JpZ2luQ3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIF9kLmJvZHkuc3R5bGUub3ZlcmZsb3cgPSB0aGlzLl92YXJpYWJsZS5fYm9keU92ZXJmbG93O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zdGlja3lUb29sYmFyID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQuZWxlbWVudC50b29sYmFyLCAnc3VuLWVkaXRvci1zdGlja3knKTtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQsICdpY29uLXJlZHVjdGlvbicpO1xyXG4gICAgICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLCAnaWNvbi1leHBhbnNpb24nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBPcGVuIHRoZSBwcmV2aWV3IHdpbmRvdyBvciBvcGVuIHRoZSBwcmludCB3aW5kb3dcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kZSAtICdwcmV2aWV3JyBvciAncHJpbnQnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgb3BlbldpbmRvd0NvbnRlbnRzOiBmdW5jdGlvbiAobW9kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpc1ByaW50ID0gbW9kZSA9PT0gJ3ByaW50JztcclxuICAgICAgICAgICAgY29uc3Qgd2luZG93T2JqZWN0ID0gX3cub3BlbignJywgJ19ibGFuaycpO1xyXG4gICAgICAgICAgICB3aW5kb3dPYmplY3QubWltZVR5cGUgPSAndGV4dC9odG1sJztcclxuICAgICAgICAgICAgd2luZG93T2JqZWN0LmRvY3VtZW50LndyaXRlKCcnICtcclxuICAgICAgICAgICAgICAgICc8IWRvY3R5cGUgaHRtbD48aHRtbD4nICtcclxuICAgICAgICAgICAgICAgICc8aGVhZD4nICtcclxuICAgICAgICAgICAgICAgICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIiAvPicgK1xyXG4gICAgICAgICAgICAgICAgJzxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwiPicgK1xyXG4gICAgICAgICAgICAgICAgJzx0aXRsZT4nICsgKGlzUHJpbnQgPyBsYW5nLnRvb2xiYXIucHJpbnQgOiBsYW5nLnRvb2xiYXIucHJldmlldykgKyAnPC90aXRsZT4nICtcclxuICAgICAgICAgICAgICAgICc8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIicgKyB1dGlsLmdldEluY2x1ZGVQYXRoKFsnc3VuZWRpdG9yLWNvbnRlbnRzJywgJ3N1bmVkaXRvciddLCAnY3NzJykgKyAnXCI+JyArXHJcbiAgICAgICAgICAgICAgICAnPC9oZWFkPicgK1xyXG4gICAgICAgICAgICAgICAgJzxib2R5PicgK1xyXG4gICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJzdW4tZWRpdG9yLWVkaXRhYmxlXCIgc3R5bGU9XCJ3aWR0aDonICsgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcub2Zmc2V0V2lkdGggKyAncHg7IG1hcmdpbjphdXRvO1wiPicgK1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb250ZW50cygpICsgJzwvZGl2PicgK1xyXG4gICAgICAgICAgICAgICAgKGlzUHJpbnQgPyAnPHNjcmlwdD5fdy5wcmludCgpOzwvc2NyaXB0PicgOiAnJykgKyAnPC9ib2R5PicgK1xyXG4gICAgICAgICAgICAgICAgJzwvaHRtbD4nKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgY3VycmVudCBjb250ZW50c1xyXG4gICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0Q29udGVudHM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRzID0gJyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiBjb250ZW50cztcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29udGVudHMgPSB1dGlsLmNvbnZlcnRDb250ZW50c0ZvckVkaXRvcihjb250ZXh0LmVsZW1lbnQuY29kZS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlckhUTUwgPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG4gICAgICAgICAgICByZW5kZXJIVE1MLmlubmVySFRNTCA9IGNvbnRlbnRzO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmlnY2FwdGlvbnMgPSB1dGlsLmdldExpc3RDaGlsZHJlbihyZW5kZXJIVE1MLCBmdW5jdGlvbiAoY3VycmVudCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC9GSUdDQVBUSU9OL2kudGVzdChjdXJyZW50Lm5vZGVOYW1lKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZmlnY2FwdGlvbnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZpZ2NhcHRpb25zW2ldLm91dGVySFRNTCA9IGZpZ2NhcHRpb25zW2ldLm91dGVySFRNTC5yZXBsYWNlKC8oPyFePGZpZ2NhcHRpb25cXHMrKShjb250ZW50ZWRpdGFibGU9XCIoW2Etel0rfFxccyopXCIpXFxzKig/PVtePl0qPikvaSwgJycpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVuZGVySFRNTC5pbm5lckhUTUw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBldmVudCBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBjb25zdCBldmVudCA9IHtcclxuICAgICAgICBfc2hvcnRjdXRLZXlDb2RlOiB7XHJcbiAgICAgICAgICAgIDY2OiBbJ2JvbGQnLCAnQiddLFxyXG4gICAgICAgICAgICA4MzogWydzdHJpa2V0aHJvdWdoJywgJ1NUUklLRSddLFxyXG4gICAgICAgICAgICA4NTogWyd1bmRlcmxpbmUnLCAnVSddLFxyXG4gICAgICAgICAgICA3MzogWydpdGFsaWMnLCAnSSddLFxyXG4gICAgICAgICAgICA4OTogWydyZWRvJ10sXHJcbiAgICAgICAgICAgIDkwOiBbJ3VuZG8nXSxcclxuICAgICAgICAgICAgMjE5OiBbJ291dGRlbnQnXSxcclxuICAgICAgICAgICAgMjIxOiBbJ2luZGVudCddXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX2RpcmVjdGlvbktleUtleUNvZGU6IG5ldyBSZWdFeHAoJ14oPzo4fDEzfDMyfDQ2fDMzfDM0fDM1fDM2fDM3fDM4fDM5fDQwfDk4fDEwMHwxMDJ8MTA0KSQnKSxcclxuXHJcbiAgICAgICAgX2NoYW5nZUJ1dHRvbkNsYXNzVGFnQ2hlY2s6IG5ldyBSZWdFeHAoJ14oPzpCfFV8SXxTVFJJS0V8U1VCfFNVUCkkJyksXHJcblxyXG4gICAgICAgIF9maW5kQnV0dG9uRWZmZWN0VGFnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRNYXAgPSBlZGl0b3IuY29tbWFuZE1hcDtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NPbkNoZWNrID0gdGhpcy5fY2hhbmdlQnV0dG9uQ2xhc3NUYWdDaGVjaztcclxuICAgICAgICAgICAgY29uc3QgY29tbWFuZE1hcE5vZGVzID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbmRGb3JtYXQgPSB0cnVlLCBmaW5kRm9udCA9IHRydWUsIGZpbmRTaXplID0gdHJ1ZSwgZmluZEEgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgZmluZEIgPSB0cnVlLCBmaW5kSSA9IHRydWUsIGZpbmRVID0gdHJ1ZSwgZmluZFMgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgY3NzVGV4dCA9ICcnLCBub2RlTmFtZSA9ICcnO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgc2VsZWN0aW9uUGFyZW50ID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTsgIXV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvblBhcmVudCk7IHNlbGVjdGlvblBhcmVudCA9IHNlbGVjdGlvblBhcmVudC5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvblBhcmVudCkgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFyZW50Lm5vZGVUeXBlICE9PSAxKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gc2VsZWN0aW9uUGFyZW50Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZXMucHVzaChub2RlTmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIEZvcm1hdCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRGb3JtYXQgJiYgdXRpbC5pc0Zvcm1hdEVsZW1lbnQoc2VsZWN0aW9uUGFyZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdGT1JNQVQnKTtcclxuICAgICAgICAgICAgICAgICAgICB1dGlsLmNoYW5nZVR4dChjb21tYW5kTWFwLkZPUk1BVCwgbm9kZU5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRGb3JtYXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogRm9udCAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRGb250ICYmIChzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udEZhbWlseS5sZW5ndGggPiAwIHx8IChzZWxlY3Rpb25QYXJlbnQuZmFjZSAmJiBzZWxlY3Rpb25QYXJlbnQuZmFjZS5sZW5ndGggPiAwKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnRk9OVCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEZvbnQgPSAoc2VsZWN0aW9uUGFyZW50LnN0eWxlLmZvbnRGYW1pbHkgfHwgc2VsZWN0aW9uUGFyZW50LmZhY2UgfHwgbGFuZy50b29sYmFyLmZvbnQpLnJlcGxhY2UoL1tcIiddL2csJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXAuRk9OVCwgc2VsZWN0Rm9udCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEZvbnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogQSAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRBICYmIC9eQSQvLnRlc3Qobm9kZU5hbWUpICYmIHNlbGVjdGlvblBhcmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaW1hZ2UtbGluaycpID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmxpbmsgfHwgZWRpdG9yLmNvbnRyb2xsZXJBcnJheVswXSAhPT0gY29udGV4dC5saW5rLmxpbmtCdG4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2xpbmsnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5saW5rLmNhbGxfY29udHJvbGxlcl9saW5rQnV0dG9uLmNhbGwoZWRpdG9yLCBzZWxlY3Rpb25QYXJlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmluZEEgJiYgY29udGV4dC5saW5rICYmIGVkaXRvci5jb250cm9sbGVyQXJyYXlbMF0gPT09IGNvbnRleHQubGluay5saW5rQnRuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqIFNQQU4gKi9cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kU2l6ZSAmJiAvXlNQQU4kLy50ZXN0KG5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8qKiBmb250IHNpemUgKi9cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uUGFyZW50LnN0eWxlLmZvbnRTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ1NJWkUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jaGFuZ2VUeHQoY29tbWFuZE1hcC5TSVpFLCBzZWxlY3Rpb25QYXJlbnQuc3R5bGUuZm9udFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5kU2l6ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKiogY29tbWFuZCBtYXAgKi9cclxuICAgICAgICAgICAgICAgIGNzc1RleHQgPSBzZWxlY3Rpb25QYXJlbnQuc3R5bGUuY3NzVGV4dDtcclxuICAgICAgICAgICAgICAgIGlmIChmaW5kQiAmJiAvZm9udFxcLXdlaWdodFxccyo6XFxzKig/OlxcZCt8Ym9sZHxib2xkZXIpKD86O3xcXHN8KS8udGVzdChjc3NUZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdCJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmluZEIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmaW5kSSAmJiAvZm9udFxcLXN0eWxlXFxzKjpcXHMqKD86aXRhbGljfG9ibGlxdWUpKD86O3xcXHMpLy50ZXN0KGNzc1RleHQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZE1hcE5vZGVzLnB1c2goJ0knKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kSSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbmRVICYmIC90ZXh0XFwtZGVjb3JhdGlvbig/OlxcLWxpbmUpP1xccyo6XFxzKnVuZGVybGluZSg/Ojt8XFxzfCkvLnRlc3QoY3NzVGV4dCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21tYW5kTWFwTm9kZXMucHVzaCgnVScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbmRVID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZmluZFMgJiYgL3RleHRcXC1kZWNvcmF0aW9uKD86XFwtbGluZSk/XFxzKjpcXHMqbGluZS10aHJvdWdoKD86O3xcXHN8KS8udGVzdChjc3NUZXh0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCdTVFJJS0UnKTtcclxuICAgICAgICAgICAgICAgICAgICBmaW5kUyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbW1hbmRNYXBOb2Rlcy5wdXNoKCgvXlNUUk9ORyQvLnRlc3Qobm9kZU5hbWUpID8gJ0InIDogL15FTSQvLnRlc3Qobm9kZU5hbWUpID8gJ0knIDogbm9kZU5hbWUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIEEgVGFnIGVkaXQgY29udHJvbGxlciBvZmYgKi9cclxuICAgICAgICAgICAgaWYgKGZpbmRBKSBlZGl0b3IuY29udHJvbGxlcnNPZmYoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKiB0b2dnbGUgY2xhc3Mgb24gKi9cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21tYW5kTWFwTm9kZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gY29tbWFuZE1hcE5vZGVzW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsYXNzT25DaGVjay50ZXN0KG5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29tbWFuZE1hcFtub2RlTmFtZV0sICdvbicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogcmVtb3ZlIGNsYXNzLCBkaXNwbGF5IHRleHQgKi9cclxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbW1hbmRNYXApIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21tYW5kTWFwTm9kZXMuaW5kZXhPZihrZXkpID4gLTEpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKC9eRk9OVC9pLnRlc3Qoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXBba2V5XSwgbGFuZy50b29sYmFyLmZvbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoL15TSVpFJC9pLnRlc3Qoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwuY2hhbmdlVHh0KGNvbW1hbmRNYXBba2V5XSwgbGFuZy50b29sYmFyLmZvbnRTaXplKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29tbWFuZE1hcFtrZXldLCAnb24nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIHNhdmUgY3VycmVudCBub2RlcyAqL1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLmN1cnJlbnROb2RlcyA9IGN1cnJlbnROb2Rlcy5yZXZlcnNlKCk7XHJcblxyXG4gICAgICAgICAgICAvKiogIERpc3BsYXlzIHRoZSBjdXJyZW50IG5vZGUgc3RydWN0dXJlIHRvIHJlc2l6aW5nQmFyICovXHJcbiAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbi5zaG93UGF0aExhYmVsKSBjb250ZXh0LmVsZW1lbnQubmF2aWdhdGlvbi50ZXh0Q29udGVudCA9IGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzLmpvaW4oJyA+ICcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9jYW5jZWxDYXB0aW9uRWRpdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCBldmVudC5fY2FuY2VsQ2FwdGlvbkVkaXQpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uTW91c2VEb3duX3Rvb2xiYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5fZWRpdG9yUmFuZ2UoKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQsICcuc3VuLWVkaXRvci1zdWJtZW51JykpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tbWFuZCA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY29tbWFuZCcpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIHdoaWxlICghY29tbWFuZCAmJiAhL2VkaXRvcl90b29sLy50ZXN0KGNsYXNzTmFtZSkgJiYgIS9zdW4tZWRpdG9yLWlkLXRvb2xiYXIvLnRlc3QoY2xhc3NOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICBpZiAoY29tbWFuZCA9PT0gZWRpdG9yLl9zdWJtZW51TmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25DbGlja190b29sYmFyOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XHJcbiAgICAgICAgICAgIGxldCBkaXNwbGF5ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1kaXNwbGF5Jyk7XHJcbiAgICAgICAgICAgIGxldCBjb21tYW5kID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jb21tYW5kJyk7XHJcbiAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSB0YXJnZXQuY2xhc3NOYW1lO1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKCFjb21tYW5kICYmICEvZWRpdG9yX3Rvb2wvLnRlc3QoY2xhc3NOYW1lKSAmJiAhL3N1bi1lZGl0b3ItaWQtdG9vbGJhci8udGVzdChjbGFzc05hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgIGNvbW1hbmQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbW1hbmQnKTtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXkgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWRpc3BsYXknKTtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRhcmdldC5jbGFzc05hbWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghY29tbWFuZCAmJiAhZGlzcGxheSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvKiogRGlhbG9nLCBTdWJtZW51ICovXHJcbiAgICAgICAgICAgIGlmIChkaXNwbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoL3N1Ym1lbnUvLnRlc3QoZGlzcGxheSkgJiYgKHRhcmdldC5uZXh0RWxlbWVudFNpYmxpbmcgPT09IG51bGwgfHwgdGFyZ2V0ICE9PSBlZGl0b3Iuc3VibWVudUFjdGl2ZUJ1dHRvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IuY2FsbFBsdWdpbihjb21tYW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zdWJtZW51T24odGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgvZGlhbG9nLy50ZXN0KGRpc3BsYXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oY29tbWFuZCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5kaWFsb2cub3Blbi5jYWxsKGVkaXRvciwgY29tbWFuZCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBlZGl0b3Iuc3VibWVudU9mZigpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKiogZGVmYXVsdCBjb21tYW5kICovXHJcbiAgICAgICAgICAgIGlmIChjb21tYW5kKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5jb21tYW5kSGFuZGxlcih0YXJnZXQsIGNvbW1hbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZVVwX3d5c2l3eWc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgZWRpdG9yLl9lZGl0b3JSYW5nZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5faXNCYWxsb29uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9IGVkaXRvci5nZXRSYW5nZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLmNvbGxhcHNlZCkgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGV2ZW50Ll9zaG93VG9vbGJhckJhbGxvb24ocmFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25DbGlja193eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZS50YXJnZXQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoL15JTUckL2kudGVzdCh0YXJnZXRFbGVtZW50Lm5vZGVOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ2ltYWdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemUgPSBlZGl0b3IucGx1Z2lucy5yZXNpemluZy5jYWxsX2NvbnRyb2xsZXJfcmVzaXplLmNhbGwoZWRpdG9yLCB0YXJnZXRFbGVtZW50LCAnaW1hZ2UnKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5pbWFnZS5vbk1vZGlmeU1vZGUuY2FsbChlZGl0b3IsIHRhcmdldEVsZW1lbnQsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsICcuc3VuLWVkaXRvci1pZC1pbWFnZS1jb250YWluZXInKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy5pbWFnZS5vcGVuTW9kaWZ5LmNhbGwoZWRpdG9yLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnBsdWdpbnMuaW1hZ2UudXBkYXRlX2ltYWdlLmNhbGwoZWRpdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoL3N1bi1lZGl0b3ItaWQtaWZyYW1lLWlubmVyLXJlc2l6aW5nLWNvdmVyL2kudGVzdCh0YXJnZXRFbGVtZW50LmNsYXNzTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGVkaXRvci5jYWxsUGx1Z2luKCd2aWRlbycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWUgPSB1dGlsLmdldENoaWxkRWxlbWVudCh0YXJnZXRFbGVtZW50LnBhcmVudE5vZGUsICdpZnJhbWUnKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplID0gZWRpdG9yLnBsdWdpbnMucmVzaXppbmcuY2FsbF9jb250cm9sbGVyX3Jlc2l6ZS5jYWxsKGVkaXRvciwgaWZyYW1lLCAndmlkZW8nKTtcclxuICAgICAgICAgICAgICAgICAgICBlZGl0b3IucGx1Z2lucy52aWRlby5vbk1vZGlmeU1vZGUuY2FsbChlZGl0b3IsIGlmcmFtZSwgc2l6ZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGV2ZW50Ll9maW5kQnV0dG9uRWZmZWN0VGFnKCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaWdjYXB0aW9uID0gdXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldEVsZW1lbnQsICdGSUdDQVBUSU9OJyk7XHJcbiAgICAgICAgICAgIGlmIChmaWdjYXB0aW9uICYmIGZpZ2NhcHRpb24uZ2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKSAhPT0gJ3R1cmUnKSB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBmaWdjYXB0aW9uLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBmaWdjYXB0aW9uLmZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGVkaXRvci5faXNJbmxpbmUgJiYgIWVkaXRvci5faW5saW5lVG9vbGJhckF0dHIuaXNTaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuX3Nob3dUb29sYmFySW5saW5lKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGVUb29sYmFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5faGlkZVRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVG9vbGJhcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgX2QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoaWRlVG9vbGJhcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZCA9IHV0aWwuZ2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbGVtZW50LCB1dGlsLmlzQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLmNvbnRyb2xsZXJBcnJheS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNhbGxQbHVnaW4oJ3RhYmxlJywgZWRpdG9yLnBsdWdpbnMudGFibGUuY2FsbF9jb250cm9sbGVyX3RhYmxlRWRpdC5iaW5kKGVkaXRvciwgdGQpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1c2VyRnVuY3Rpb24ub25DbGljaykgdXNlckZ1bmN0aW9uLm9uQ2xpY2soZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dUb29sYmFyQmFsbG9vbjogZnVuY3Rpb24gKHJhbmdlT2JqKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gcmFuZ2VPYmogfHwgZWRpdG9yLmdldFJhbmdlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmcgPSAyMDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRleHQuZWxlbWVudC50b29sYmFyO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSBfdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBpc0RpclRvcDtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IHNlbGVjdGlvbi5hbmNob3JOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpc0RpclRvcCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldCA8IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGVzID0gdXRpbC5nZXRMaXN0Q2hpbGROb2RlcyhyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICBpc0RpclRvcCA9IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzZWxlY3Rpb24uZm9jdXNOb2RlKSA8IHV0aWwuZ2V0QXJyYXlJbmRleChjaGlsZE5vZGVzLCBzZWxlY3Rpb24uYW5jaG9yTm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCByZWN0cyA9IHJhbmdlLmdldENsaWVudFJlY3RzKCk7XHJcbiAgICAgICAgICAgIHJlY3RzID0gcmVjdHNbaXNEaXJUb3AgPyAwIDogcmVjdHMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhcldpZHRoID0gdG9vbGJhci5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRvb2xiYXIub2Zmc2V0SGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgbGV0IGwgPSAoaXNEaXJUb3AgPyByZWN0cy5sZWZ0IDogcmVjdHMucmlnaHQpIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0TGVmdCArIChfdy5zY3JvbGxYIHx8IF9kLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSAtIHRvb2xiYXJXaWR0aCAvIDI7XHJcbiAgICAgICAgICAgIGxldCB0ID0gKGlzRGlyVG9wID8gcmVjdHMudG9wIC0gdG9vbGJhckhlaWdodCAtIDExIDogcmVjdHMuYm90dG9tICsgMTEpIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0VG9wICsgKF93LnNjcm9sbFkgfHwgX2QuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvdmVyUmlnaHQgPSBsICsgdG9vbGJhcldpZHRoIC0gY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLmxlZnQgPSAobCA8IDAgPyBwYWRkaW5nIDogb3ZlclJpZ2h0IDwgMCA/IGwgOiBsIC0gb3ZlclJpZ2h0IC0gcGFkZGluZykgKyAncHgnO1xyXG4gICAgICAgICAgICB0b29sYmFyLnN0eWxlLnRvcCA9ICh0KSArICdweCc7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNEaXJUb3ApIHtcclxuICAgICAgICAgICAgICAgIHV0aWwucmVtb3ZlQ2xhc3MoY29udGV4dC5lbGVtZW50Ll9hcnJvdywgJ2Fycm93LXVwJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy1kb3duJyk7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuX2Fycm93LnN0eWxlLnRvcCA9ICh0b29sYmFySGVpZ2h0KSArICdweCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUNsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy1kb3duJyk7XHJcbiAgICAgICAgICAgICAgICB1dGlsLmFkZENsYXNzKGNvbnRleHQuZWxlbWVudC5fYXJyb3csICdhcnJvdy11cCcpO1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Ll9hcnJvdy5zdHlsZS50b3AgPSAnLTExcHgnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhcnJvd193aWR0aCA9IGNvbnRleHQuZWxlbWVudC5fYXJyb3cub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycm93X2xlZnQgPSAodG9vbGJhcldpZHRoIC8gMiArIChsIDwgMCA/IGwgLSBhcnJvd193aWR0aCA6IG92ZXJSaWdodCA8IDAgPyAwIDogb3ZlclJpZ2h0ICsgYXJyb3dfd2lkdGgpKTtcclxuICAgICAgICAgICAgY29uc3QgYXJyb3dfcG9pbnRfd2lkdGggPSBhcnJvd193aWR0aCAvIDI7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5fYXJyb3cuc3R5bGUubGVmdCA9IChhcnJvd19sZWZ0IDwgYXJyb3dfcG9pbnRfd2lkdGggPyBhcnJvd19wb2ludF93aWR0aCA6IGFycm93X2xlZnQgKyBhcnJvd19wb2ludF93aWR0aCA+PSB0b29sYmFyV2lkdGggPyBhcnJvd19sZWZ0IC0gYXJyb3dfcG9pbnRfd2lkdGggOiBhcnJvd19sZWZ0KSArICdweCc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX3Nob3dUb29sYmFySW5saW5lOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2xiYXIgPSBjb250ZXh0LmVsZW1lbnQudG9vbGJhcjtcclxuICAgICAgICAgICAgdG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci53aWR0aCA9IHRvb2xiYXIuc3R5bGUud2lkdGggPSBjb250ZXh0Lm9wdGlvbi50b29sYmFyV2lkdGg7XHJcbiAgICAgICAgICAgIGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIudG9wID0gdG9vbGJhci5zdHlsZS50b3AgPSAoLTEgLSB0b29sYmFyLm9mZnNldEhlaWdodCkgKyAncHgnO1xyXG4gICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgZWRpdG9yLl9pbmxpbmVUb29sYmFyQXR0ci5pc1Nob3cgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9oaWRlVG9vbGJhcjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLmlzU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uS2V5RG93bl93eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZS5rZXlDb2RlO1xyXG4gICAgICAgICAgICBjb25zdCBzaGlmdCA9IGUuc2hpZnRLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IGN0cmwgPSBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5O1xyXG4gICAgICAgICAgICBjb25zdCBhbHQgPSBlLmFsdEtleTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX2lzQmFsbG9vbikge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX2hpZGVUb29sYmFyKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHNob3J0Y3V0Q29tbWFuZChrZXlDb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBldmVudC5fc2hvcnRjdXRLZXlDb2RlW2tleUNvZGVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFrZXkpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuY29tbWFuZEhhbmRsZXIodXRpbC5nZXRGb3JtYXRFbGVtZW50KGVkaXRvci5nZXRTZWxlY3Rpb25Ob2RlKCkpLCBrZXlbMF0pO1xyXG4gICAgICAgICAgICAgICAgdXRpbC50b2dnbGVDbGFzcyhlZGl0b3IuY29tbWFuZE1hcFtrZXlbMV1dLCAnb24nKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLyoqIFNob3J0Y3V0cyAqL1xyXG4gICAgICAgICAgICBpZiAoY3RybCAmJiAhL14oPzoxNnwxN3wxOCkkLy50ZXN0KGtleUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoISghc2hpZnQgJiYga2V5Q29kZSA9PT0gODMpICYmIHNob3J0Y3V0Q29tbWFuZChrZXlDb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiBkZWZhdWx0IGtleSBhY3Rpb24gKi9cclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uTm9kZSA9IGVkaXRvci5nZXRTZWxlY3Rpb25Ob2RlKCk7XHJcbiAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSA4OiAvKipiYWNrc3BhY2Uga2V5Ki9cclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbC5pc0Zvcm1hdEVsZW1lbnQoc2VsZWN0aW9uTm9kZSkgJiYgdXRpbC5pc1d5c2l3eWdEaXYoc2VsZWN0aW9uTm9kZS5wYXJlbnROb2RlKSAmJiBzZWxlY3Rpb25Ob2RlLnByZXZpb3VzU2libGluZyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbk5vZGUuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgOTpcclxuICAgICAgICAgICAgICAgICAgICAvKip0YWIga2V5Ki9cclxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0cmwgfHwgYWx0KSBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHNlbGVjdGlvbk5vZGUgfHwgZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXV0aWwuaXNDZWxsKGN1cnJlbnROb2RlKSAmJiAhdXRpbC5pc1d5c2l3eWdEaXYoY3VycmVudE5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiB1dGlsLmlzQ2VsbChjdXJyZW50Tm9kZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSB1dGlsLmdldFBhcmVudEVsZW1lbnQoY3VycmVudE5vZGUsICd0YWJsZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxscyA9IHV0aWwuZ2V0TGlzdENoaWxkcmVuKHRhYmxlLCB1dGlsLmlzQ2VsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBzaGlmdCA/IHV0aWwucHJldklkeChjZWxscywgY3VycmVudE5vZGUpIDogdXRpbC5uZXh0SWR4KGNlbGxzLCBjdXJyZW50Tm9kZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBjZWxscy5sZW5ndGggJiYgIXNoaWZ0KSBpZHggPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSAtMSAmJiBzaGlmdCkgaWR4ID0gY2VsbHMubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdmVDZWxsID0gY2VsbHNbaWR4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3ZlQ2VsbCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9yLnNldFJhbmdlKG1vdmVDZWxsLCAwLCBtb3ZlQ2VsbCwgMCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qKiBmb3JtYXQgVGFnICovXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBlZGl0b3IuZ2V0U2VsZWN0ZWRGb3JtYXRFbGVtZW50cygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNoaWZ0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYlRleHQgPSB1dGlsLmNyZWF0ZVRleHROb2RlKG5ldyBBcnJheShlZGl0b3IuX3ZhcmlhYmxlLnRhYlNpemUgKyAxKS5qb2luKCdcXHUwMEEwJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuaW5zZXJ0Tm9kZSh0YWJUZXh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZXRSYW5nZSh0YWJUZXh0LCBlZGl0b3IuX3ZhcmlhYmxlLnRhYlNpemUsIHRhYlRleHQsIGVkaXRvci5fdmFyaWFibGUudGFiU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tpXS5pbnNlcnRCZWZvcmUodGFiVGV4dC5jbG9uZU5vZGUoZmFsc2UpLCBsaW5lc1tpXS5maXJzdENoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaW5lcy5sZW5ndGgsIGNoaWxkOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkID0gbGluZXNbaV0uZmlyc3RDaGlsZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXlxcc3sxLDR9JC8udGVzdChjaGlsZC50ZXh0Q29udGVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnJlbW92ZUl0ZW0oY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXlxcc3sxLDR9Ly50ZXN0KGNoaWxkLnRleHRDb250ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnRleHRDb250ZW50ID0gY2hpbGQudGV4dENvbnRlbnQucmVwbGFjZSgvXlxcc3sxLDR9LywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHVzZXJGdW5jdGlvbi5vbktleURvd24pIHVzZXJGdW5jdGlvbi5vbktleURvd24oZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25LZXlVcF93eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlZGl0b3IuX2VkaXRvclJhbmdlKCk7XHJcbiAgICAgICAgICAgIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Ob2RlID0gZWRpdG9yLmdldFNlbGVjdGlvbk5vZGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX2lzQmFsbG9vbiAmJiAhZWRpdG9yLmdldFJhbmdlKCkuY29sbGFwc2VkKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fc2hvd1Rvb2xiYXJCYWxsb29uKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiB3aGVuIGZvcm1hdCB0YWcgZGVsZXRlZCAqL1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSA4ICYmIHV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvbk5vZGUpICYmIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvRm9ybWF0VGFnID0gdXRpbC5jcmVhdGVFbGVtZW50KHV0aWwuaXNGb3JtYXRFbGVtZW50KGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzWzBdKSA/IGVkaXRvci5fdmFyaWFibGUuY3VycmVudE5vZGVzWzBdIDogJ1AnKTtcclxuICAgICAgICAgICAgICAgIG9Gb3JtYXRUYWcuaW5uZXJIVE1MID0gdXRpbC56ZXJvV2lkdGhTcGFjZTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25Ob2RlLmFwcGVuZENoaWxkKG9Gb3JtYXRUYWcpO1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLnNldFJhbmdlKG9Gb3JtYXRUYWcsIDAsIG9Gb3JtYXRUYWcsIDApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoKHV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvbk5vZGUucGFyZW50RWxlbWVudCkgfHwgdXRpbC5pc1JhbmdlRm9ybWF0RWxlbWVudChzZWxlY3Rpb25Ob2RlLnBhcmVudEVsZW1lbnQpKSAmJiBzZWxlY3Rpb25Ob2RlLm5vZGVUeXBlID09PSAzKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZXhlY0NvbW1hbmQoJ2Zvcm1hdEJsb2NrJywgZmFsc2UsIHV0aWwuaXNXeXNpd3lnRGl2KHNlbGVjdGlvbk5vZGUucGFyZW50RWxlbWVudCkgPyAnUCcgOiAnRElWJyk7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fZmluZEJ1dHRvbkVmZmVjdFRhZygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuX2RpcmVjdGlvbktleUtleUNvZGUudGVzdChlLmtleUNvZGUpKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fZmluZEJ1dHRvbkVmZmVjdFRhZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uS2V5VXApIHVzZXJGdW5jdGlvbi5vbktleVVwKGUpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uU2Nyb2xsX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5jb250cm9sbGVyc09mZigpO1xyXG4gICAgICAgICAgICBpZiAodXNlckZ1bmN0aW9uLm9uU2Nyb2xsKSB1c2VyRnVuY3Rpb24ub25TY3JvbGwoZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Ecm9wX3d5c2l3eWc6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gZS5kYXRhVHJhbnNmZXIuZmlsZXM7XHJcblxyXG4gICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgIGVkaXRvci5jYWxsUGx1Z2luKCdpbWFnZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmltYWdlLmltZ0lucHV0RmlsZS5maWxlcyA9IGZpbGVzO1xyXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zLmltYWdlLm9uUmVuZGVyX2ltZ0lucHV0LmNhbGwoZWRpdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmltYWdlLmltZ0lucHV0RmlsZS5maWxlcyA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHVzZXJGdW5jdGlvbi5vbkRyb3ApIHVzZXJGdW5jdGlvbi5vbkRyb3AoZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25Nb3VzZURvd25fcmVzaXppbmdCYXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkgPSBlLmNsaWVudFk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemVCYWNrZ3JvdW5kLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAgICAgZnVuY3Rpb24gY2xvc3VyZUZ1bmMoKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQucmVzaXplQmFja2dyb3VuZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQuX3Jlc2l6ZV9lZGl0b3IpO1xyXG4gICAgICAgICAgICAgICAgX2QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNsb3N1cmVGdW5jKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX2QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnQuX3Jlc2l6ZV9lZGl0b3IpO1xyXG4gICAgICAgICAgICBfZC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xvc3VyZUZ1bmMpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9yZXNpemVfZWRpdG9yOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZXNpemVJbnRlcnZhbCA9IGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLm9mZnNldEhlaWdodCArIChlLmNsaWVudFkgLSBlZGl0b3IuX3ZhcmlhYmxlLnJlc2l6ZUNsaWVudFkpO1xyXG4gICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5zdHlsZS5oZWlnaHQgPSBjb250ZXh0LmVsZW1lbnQuY29kZS5zdHlsZS5oZWlnaHQgPSAocmVzaXplSW50ZXJ2YWwgPCBlZGl0b3IuX3ZhcmlhYmxlLm1pblJlc2l6aW5nU2l6ZSA/IGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplIDogcmVzaXplSW50ZXJ2YWwpICsgJ3B4JztcclxuICAgICAgICAgICAgZWRpdG9yLl92YXJpYWJsZS5yZXNpemVDbGllbnRZID0gZS5jbGllbnRZO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIG9uUmVzaXplX3dpbmRvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGV4dC5lbGVtZW50LnRvb2xiYXIub2Zmc2V0V2lkdGggPT09IDApIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgICAgICAgZWRpdG9yLl92YXJpYWJsZS5pbm5lckhlaWdodF9mdWxsU2NyZWVuICs9IChfdy5pbm5lckhlaWdodCAtIGNvbnRleHQuZWxlbWVudC50b29sYmFyLm9mZnNldEhlaWdodCkgLSBlZGl0b3IuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW47XHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5oZWlnaHQgPSBlZGl0b3IuX3ZhcmlhYmxlLmlubmVySGVpZ2h0X2Z1bGxTY3JlZW4gKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGVkaXRvci5fdmFyaWFibGUuX3N0aWNreSkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuc3R5bGUud2lkdGggPSAoY29udGV4dC5lbGVtZW50LnRvcEFyZWEub2Zmc2V0V2lkdGggLSAyKSArICdweCc7XHJcbiAgICAgICAgICAgICAgICBldmVudC5vblNjcm9sbF93aW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZWRpdG9yLmNvbnRyb2xsZXJzT2ZmKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25TY3JvbGxfd2luZG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLmlzRnVsbFNjcmVlbiB8fCBjb250ZXh0LmVsZW1lbnQudG9vbGJhci5vZmZzZXRXaWR0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvbnRleHQuZWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gZWxlbWVudC5lZGl0b3JBcmVhLm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgY29uc3QgZWRpdG9yVG9wID0gZWxlbWVudC50b3BBcmVhLm9mZnNldFRvcCAtIChlZGl0b3IuX2lzSW5saW5lID8gZWxlbWVudC50b29sYmFyLm9mZnNldEhlaWdodCA6IDApO1xyXG4gICAgICAgICAgICBjb25zdCB5ID0gKHRoaXMuc2Nyb2xsWSB8fCBfZC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKSArIGNvbnRleHQub3B0aW9uLnN0aWNreVRvb2xiYXI7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoeSA8IGVkaXRvclRvcCkge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQuX29mZlN0aWNreVRvb2xiYXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoeSArIGVkaXRvci5fdmFyaWFibGUubWluUmVzaXppbmdTaXplID49IGVkaXRvckhlaWdodCArIGVkaXRvclRvcCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFlZGl0b3IuX3ZhcmlhYmxlLl9zdGlja3kpIGV2ZW50Ll9vblN0aWNreVRvb2xiYXIoZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRvb2xiYXIuc3R5bGUudG9wID0gKGVkaXRvckhlaWdodCArIGVkaXRvclRvcCArIGNvbnRleHQub3B0aW9uLnN0aWNreVRvb2xiYXIgLXkgLSBlZGl0b3IuX3ZhcmlhYmxlLm1pblJlc2l6aW5nU2l6ZSkgKyAncHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHkgPj0gZWRpdG9yVG9wKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5fb25TdGlja3lUb29sYmFyKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgX29uU3RpY2t5VG9vbGJhcjogZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFlZGl0b3IuX2lzSW5saW5lKSB7XHJcbiAgICAgICAgICAgICAgICBlbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5oZWlnaHQgPSBlbGVtZW50LnRvb2xiYXIub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuX3N0aWNreUR1bW15LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50LnRvb2xiYXIuc3R5bGUudG9wID0gY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciArICdweCc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IGVkaXRvci5faXNJbmxpbmUgPyBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLndpZHRoIDogZWxlbWVudC50b29sYmFyLm9mZnNldFdpZHRoICsgJ3B4JztcclxuICAgICAgICAgICAgdXRpbC5hZGRDbGFzcyhlbGVtZW50LnRvb2xiYXIsICdzdW4tZWRpdG9yLXN0aWNreScpO1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLl9zdGlja3kgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIF9vZmZTdGlja3lUb29sYmFyOiBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50Ll9zdGlja3lEdW1teS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgICAgICBlbGVtZW50LnRvb2xiYXIuc3R5bGUudG9wID0gZWRpdG9yLl9pc0lubGluZSA/IGVkaXRvci5faW5saW5lVG9vbGJhckF0dHIudG9wIDogJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQudG9vbGJhci5zdHlsZS53aWR0aCA9IGVkaXRvci5faXNJbmxpbmUgPyBlZGl0b3IuX2lubGluZVRvb2xiYXJBdHRyLndpZHRoIDogJyc7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuZWRpdG9yQXJlYS5zdHlsZS5tYXJnaW5Ub3AgPSAnJztcclxuICAgICAgICAgICAgdXRpbC5yZW1vdmVDbGFzcyhlbGVtZW50LnRvb2xiYXIsICdzdW4tZWRpdG9yLXN0aWNreScpO1xyXG4gICAgICAgICAgICBlZGl0b3IuX3ZhcmlhYmxlLl9zdGlja3kgPSBmYWxzZTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBfY29kZVZpZXdBdXRvU2Nyb2xsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnN0eWxlLmhlaWdodCA9IGNvbnRleHQuZWxlbWVudC5jb2RlLnNjcm9sbEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgb25QYXN0ZV93eXNpd3lnOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoIWUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuRGF0YSA9IHV0aWwuY2xlYW5IVE1MKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoY2xlYW5EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBlZGl0b3IuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgY2xlYW5EYXRhKTtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAvKiogdG9vbGJhciBldmVudCAqL1xyXG4gICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZXZlbnQub25Nb3VzZURvd25fdG9vbGJhciwgZmFsc2UpO1xyXG4gICAgY29udGV4dC5lbGVtZW50LnRvb2xiYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldmVudC5vbkNsaWNrX3Rvb2xiYXIsIGZhbHNlKTtcclxuICAgIC8qKiBlZGl0b3IgYXJlYSAqL1xyXG4gICAgY29udGV4dC5lbGVtZW50LnJlbGF0aXZlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZWRpdG9yLmZvY3VzLmJpbmQoZWRpdG9yKSwgZmFsc2UpO1xyXG4gICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGV2ZW50Lm9uTW91c2VVcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50Lm9uQ2xpY2tfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZXZlbnQub25TY3JvbGxfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGV2ZW50Lm9uS2V5RG93bl93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIGV2ZW50Lm9uS2V5VXBfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIGV2ZW50Lm9uRHJvcF93eXNpd3lnLCBmYWxzZSk7XHJcbiAgICBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zy5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50Lm9uUGFzdGVfd3lzaXd5ZywgZmFsc2UpO1xyXG4gICAgXHJcbiAgICAvKiogY29kZSB2aWV3IGFyZWEgYXV0byBsaW5lICovXHJcbiAgICBpZiAoY29udGV4dC5vcHRpb24uaGVpZ2h0ID09PSAnYXV0bycpIGNvbnRleHQuZWxlbWVudC5jb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnQuX2NvZGVWaWV3QXV0b1Njcm9sbCwgZmFsc2UpO1xyXG5cclxuICAgIC8qKiByZXNpemluZ0JhciAqL1xyXG4gICAgaWYgKGNvbnRleHQuZWxlbWVudC5yZXNpemluZ0Jhcikge1xyXG4gICAgICAgIGlmICgvXFxkKy8udGVzdChjb250ZXh0Lm9wdGlvbi5oZWlnaHQpKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5yZXNpemluZ0Jhci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBldmVudC5vbk1vdXNlRG93bl9yZXNpemluZ0JhciwgZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHV0aWwuYWRkQ2xhc3MoY29udGV4dC5lbGVtZW50LnJlc2l6aW5nQmFyLCAnbm9uZS1yZXNpemUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIGlubGluZSBlZGl0b3IgKi9cclxuICAgIGlmIChlZGl0b3IuX2lzSW5saW5lKSB7XHJcbiAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBldmVudC5fc2hvd1Rvb2xiYXJJbmxpbmUsIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZWRpdG9yLl9pc0lubGluZSB8fCBlZGl0b3IuX2lzQmFsbG9vbikge1xyXG4gICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBldmVudC5faGlkZVRvb2xiYXIsIGZhbHNlKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqIHdpbmRvdyBldmVudCAqL1xyXG4gICAgX3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZXZlbnQub25SZXNpemVfd2luZG93LCBmYWxzZSk7XHJcbiAgICBpZiAoY29udGV4dC5vcHRpb24uc3RpY2t5VG9vbGJhciA+IC0xKSBfdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBldmVudC5vblNjcm9sbF93aW5kb3csIGZhbHNlKTtcclxuXHJcbiAgICAvKiogYWRkIHBsdWdpbiB0byBwbHVnaW5zIG9iamVjdCAqL1xyXG4gICAgaWYgKHBsdWdpbnMpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5tYXAoZnVuY3Rpb24oa2V5KSB7XHJcbiAgICAgICAgICAgIGxldCBwbHVnaW4gPSBwbHVnaW5zW2tleV07XHJcbiAgICAgICAgICAgIGVkaXRvci5wbHVnaW5zW3BsdWdpbi5uYW1lXSA9IHV0aWwuY29weU9iaihwbHVnaW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBVc2VyIGZ1bmN0aW9uICovXHJcbiAgICBjb25zdCB1c2VyRnVuY3Rpb24gPSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGZ1bmN0aW9uc1xyXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIEV2ZW50IE9iamVjdFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG9uU2Nyb2xsOiBudWxsLFxyXG4gICAgICAgIG9uQ2xpY2s6IG51bGwsXHJcbiAgICAgICAgb25LZXlEb3duOiBudWxsLFxyXG4gICAgICAgIG9uS2V5VXA6IG51bGwsXHJcbiAgICAgICAgb25Ecm9wOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2FsbGVkIHdoZW4gdGhlIGltYWdlIGlzIHVwbG9hZGVkIG9yIHRoZSB1cGxvYWRlZCBpbWFnZSBpcyBkZWxldGVkXHJcbiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRJbWdFbGVtZW50IC0gQ3VycmVudCBpbWcgZWxlbWVudFxyXG4gICAgICAgICAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCAtIFVwbG9hZGVkIGluZGV4XHJcbiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc0RlbGV0ZSAtIFdoZXRoZXIgb3Igbm90IGl0IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIGRlbGV0ZSBvcGVyYXRpb25cclxuICAgICAgICAgKi9cclxuICAgICAgICBvbkltYWdlVXBsb2FkOiBudWxsLFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiBhIG5vdGljZSBhcmVhXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgLSBOb3RpY2UgbWVzc2FnZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG5vdGljZU9wZW46IGZ1bmN0aW9uIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGVkaXRvci5hZGRNb2R1bGUoW25vdGljZV0pO1xyXG4gICAgICAgICAgICBub3RpY2Uub3Blbi5jYWxsKGVkaXRvciwgbWVzc2FnZSk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIENsb3NlIGEgbm90aWNlIGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBub3RpY2VDbG9zZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBlZGl0b3IuYWRkTW9kdWxlKFtub3RpY2VdKTtcclxuICAgICAgICAgICAgbm90aWNlLmNsb3NlLmNhbGwoZWRpdG9yKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ29weWluZyB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvciB0byB0aGUgb3JpZ2luYWwgdGV4dGFyZWFcclxuICAgICAgICAgKi9cclxuICAgICAgICBzYXZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5vcmlnaW5FbGVtZW50LnZhbHVlID0gZWRpdG9yLmdldENvbnRlbnRzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHN1bmVkaXRvcidzIGNvbnRleHQgb2JqZWN0LiBDb250YWlucyBzZXR0aW5ncywgcGx1Z2lucywgYW5kIGNhY2hlZCBlbGVtZW50IG9iamVjdHNcclxuICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldENvbnRlbnRzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlZGl0b3IuZ2V0Q29udGVudHMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gR2V0cyB1cGxvYWRlZCBpbWFnZXMgaW5mb3JtYXRpb25zXHJcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldEltYWdlc0luZm86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVkaXRvci5fdmFyaWFibGUuX2ltYWdlc0luZm87XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIEluc2VydHMgYW4gSFRNTCBlbGVtZW50IG9yIEhUTUwgc3RyaW5nIG9yIHBsYWluIHN0cmluZyBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR8U3RyaW5nfSBodG1sIC0gSFRNTCBFbGVtZW50IG9yIEhUTUwgc3RyaW5nIG9yIHBsYWluIHN0cmluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGluc2VydEhUTUw6IGZ1bmN0aW9uIChodG1sKSB7XHJcbiAgICAgICAgICAgIGlmICghaHRtbC5ub2RlVHlwZSB8fCBodG1sLm5vZGVUeXBlICE9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHV0aWwuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgICAgICAgICAgICBodG1sID0gdGVtcGxhdGUuZmlyc3RDaGlsZCB8fCB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGVkaXRvci5pbnNlcnROb2RlKGh0bWwpO1xyXG4gICAgICAgICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQ2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbnRlbnRzIC0gQ29udGVudHMgdG8gSW5wdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzZXRDb250ZW50czogZnVuY3Rpb24gKGNvbnRlbnRzKSB7XHJcbiAgICAgICAgICAgIGlmIChlZGl0b3IuX3ZhcmlhYmxlLnd5c2l3eWdBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC53eXNpd3lnLmlubmVySFRNTCA9IHV0aWwuY29udmVydENvbnRlbnRzRm9yRWRpdG9yKGNvbnRlbnRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlID0gY29udGVudHM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGNvbnRlbnRzIHRvIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29udGVudHMgLSBDb250ZW50cyB0byBJbnB1dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGFwcGVuZENvbnRlbnRzOiBmdW5jdGlvbiAoY29udGVudHMpIHtcclxuICAgICAgICAgICAgaWYgKGVkaXRvci5fdmFyaWFibGUud3lzaXd5Z0FjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuaW5uZXJIVE1MICs9IHV0aWwuY29udmVydENvbnRlbnRzRm9yRWRpdG9yKGNvbnRlbnRzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnZhbHVlICs9IGNvbnRlbnRzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERpc2FibGUgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRpc2FibGVkOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQudG9vbC5jb3Zlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC5jb2RlLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVzY3JpcHRpb24gRW5hYmxlZCB0aGUgc3VuZWRpdG9yXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZW5hYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb250ZXh0LnRvb2wuY292ZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcuc2V0QXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnLCB0cnVlKTtcclxuICAgICAgICAgICAgY29udGV4dC5lbGVtZW50LmNvZGUucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcEFyZWFTdHlsZSA9IGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlO1xyXG4gICAgICAgICAgICBpZiAodG9wQXJlYVN0eWxlLmRpc3BsYXkgPT09ICdub25lJykgdG9wQXJlYVN0eWxlLmRpc3BsYXkgPSBjb250ZXh0Lm9wdGlvbi5kaXNwbGF5O1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXNjcmlwdGlvbiBIaWRlIHRoZSBzdW5lZGl0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBoaWRlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnRleHQuZWxlbWVudC50b3BBcmVhLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlc2NyaXB0aW9uIERlc3Ryb3kgdGhlIHN1bmVkaXRvclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgLyoqIHJlbW92ZSB3aW5kb3cgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgICAgIF93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGV2ZW50Lm9uUmVzaXplX3dpbmRvdyk7XHJcbiAgICAgICAgICAgIF93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGV2ZW50Lm9uU2Nyb2xsX3dpbmRvdyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvKiogcmVtb3ZlIGVsZW1lbnQgKi9cclxuICAgICAgICAgICAgdXRpbC5yZW1vdmVJdGVtKGNvbnRleHQuZWxlbWVudC50b3BBcmVhKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMub25TY3JvbGwgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2xpY2sgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLm9uS2V5RG93biA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25LZXlVcCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMub25Ecm9wID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zYXZlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5vbkltYWdlVXBsb2FkID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VPcGVuID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5ub3RpY2VDbG9zZSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGVudHMgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmdldEltYWdlc0luZm8gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEhUTUwgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRzID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5hcHBlbmRDb250ZW50cyA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVuYWJsZWQgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnNob3cgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3kgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgY29udGV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIHBsdWdpbnMgPSBudWxsO1xyXG4gICAgICAgICAgICBsYW5nID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB1c2VyRnVuY3Rpb247XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjb3JlOyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUlBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFDQTtBQVdBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWpCQTtBQUNBO0FBbUJBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBaERBO0FBQ0E7QUFrREE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBYUE7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3a0RBO0FBZ2xEQTs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFXQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5REE7QUFDQTtBQWdFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBcGtCQTtBQXVrQkE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBOUtBO0FBaUxBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/lib/core.js\n"); /***/ }), @@ -166,7 +166,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/*\r\n * wysiwyg web editor\r /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/util */ \"./src/lib/util.js\");\n/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'notice',\n add: function (core) {\n const context = core.context;\n context.notice = {};\n /** dialog */\n\n let notice_div = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n let notice_span = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('SPAN');\n let notice_button = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('BUTTON');\n notice_div.className = 'sun-editor-id-notice';\n notice_button.className = 'close';\n notice_button.setAttribute('aria-label', 'Close');\n notice_button.setAttribute('title', core.lang.dialogBox.close);\n notice_button.innerHTML = '
    ';\n notice_div.appendChild(notice_span);\n notice_div.appendChild(notice_button);\n context.notice.modal = notice_div;\n context.notice.message = notice_span;\n /** add event listeners */\n\n notice_button.addEventListener('click', this.onClick_cancel.bind(core));\n /** append html */\n\n context.element.editorArea.insertBefore(notice_div, context.element.wysiwyg);\n /** empty memory */\n\n notice_div = null;\n },\n onClick_cancel: function (e) {\n e.preventDefault();\n e.stopPropagation();\n this.plugins.notice.close.call(this);\n },\n open: function (text) {\n this.context.notice.message.textContent = text;\n this.context.notice.modal.style.display = 'block';\n },\n close: function () {\n this.context.notice.modal.style.display = 'none';\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGx1Z2lucy9tb2R1bGVzL25vdGljZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvbm90aWNlLmpzPzNjMDUiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxuICpcbiAqIHN1bmVkaXRvci5qc1xuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cbiAqIE1JVCBsaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIG5hbWU6ICdub3RpY2UnLFxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUpIHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNvcmUuY29udGV4dDtcbiAgICAgICAgY29udGV4dC5ub3RpY2UgPSB7fTtcblxuICAgICAgICAvKiogZGlhbG9nICovXG4gICAgICAgIGxldCBub3RpY2VfZGl2ID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgbGV0IG5vdGljZV9zcGFuID0gdXRpbC5jcmVhdGVFbGVtZW50KCdTUEFOJyk7XG4gICAgICAgIGxldCBub3RpY2VfYnV0dG9uID0gdXRpbC5jcmVhdGVFbGVtZW50KCdCVVRUT04nKTtcblxuICAgICAgICBub3RpY2VfZGl2LmNsYXNzTmFtZSA9ICdzdW4tZWRpdG9yLWlkLW5vdGljZSc7XG4gICAgICAgIG5vdGljZV9idXR0b24uY2xhc3NOYW1lID0gJ2Nsb3NlJztcbiAgICAgICAgbm90aWNlX2J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UnKTtcbiAgICAgICAgbm90aWNlX2J1dHRvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgY29yZS5sYW5nLmRpYWxvZ0JveC5jbG9zZSk7XG4gICAgICAgIG5vdGljZV9idXR0b24uaW5uZXJIVE1MID0gJzxkaXYgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1jb21tYW5kPVwiY2xvc2VcIiBjbGFzcz1cImljb24tY2FuY2VsXCI+PC9kaXY+JztcbiAgICAgICAgXG4gICAgICAgIG5vdGljZV9kaXYuYXBwZW5kQ2hpbGQobm90aWNlX3NwYW4pO1xuICAgICAgICBub3RpY2VfZGl2LmFwcGVuZENoaWxkKG5vdGljZV9idXR0b24pO1xuXG4gICAgICAgIGNvbnRleHQubm90aWNlLm1vZGFsID0gbm90aWNlX2RpdjtcbiAgICAgICAgY29udGV4dC5ub3RpY2UubWVzc2FnZSA9IG5vdGljZV9zcGFuO1xuXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXG4gICAgICAgIG5vdGljZV9idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2tfY2FuY2VsLmJpbmQoY29yZSkpO1xuICAgICAgICBcbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXG4gICAgICAgIGNvbnRleHQuZWxlbWVudC5lZGl0b3JBcmVhLmluc2VydEJlZm9yZShub3RpY2VfZGl2LCBjb250ZXh0LmVsZW1lbnQud3lzaXd5Zyk7XG4gICAgICAgIFxuICAgICAgICAvKiogZW1wdHkgbWVtb3J5ICovXG4gICAgICAgIG5vdGljZV9kaXYgPSBudWxsO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrX2NhbmNlbDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLnBsdWdpbnMubm90aWNlLmNsb3NlLmNhbGwodGhpcyk7XG4gICAgfSxcblxuICAgIG9wZW46IGZ1bmN0aW9uICh0ZXh0KSAge1xuICAgICAgICB0aGlzLmNvbnRleHQubm90aWNlLm1lc3NhZ2UudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgICAgICB0aGlzLmNvbnRleHQubm90aWNlLm1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0sXG5cbiAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQubm90aWNlLm1vZGFsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQTlDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/plugins/modules/notice.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../lib/util */ \"./src/lib/util.js\");\n/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'notice',\n add: function (core) {\n const context = core.context;\n context.notice = {};\n /** dialog */\n\n let notice_div = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('DIV');\n let notice_span = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('SPAN');\n let notice_button = _lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].createElement('BUTTON');\n notice_div.className = 'sun-editor-id-notice';\n notice_button.className = 'close';\n notice_button.setAttribute('aria-label', 'Close');\n notice_button.setAttribute('title', core.lang.dialogBox.close);\n notice_button.innerHTML = '
    ';\n notice_div.appendChild(notice_span);\n notice_div.appendChild(notice_button);\n context.notice.modal = notice_div;\n context.notice.message = notice_span;\n /** add event listeners */\n\n notice_button.addEventListener('click', this.onClick_cancel.bind(core));\n /** append html */\n\n context.element.editorArea.insertBefore(notice_div, context.element.wysiwyg);\n /** empty memory */\n\n notice_div = null;\n },\n onClick_cancel: function (e) {\n e.preventDefault();\n e.stopPropagation();\n this.plugins.notice.close.call(this);\n },\n open: function (text) {\n this.context.notice.message.textContent = text;\n this.context.notice.modal.style.display = 'block';\n },\n close: function () {\n this.context.notice.modal.style.display = 'none';\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvcGx1Z2lucy9tb2R1bGVzL25vdGljZS5qcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL21vZHVsZXMvbm90aWNlLmpzPzNjMDUiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogd3lzaXd5ZyB3ZWIgZWRpdG9yXHJcbiAqXHJcbiAqIHN1bmVkaXRvci5qc1xyXG4gKiBDb3B5cmlnaHQgMjAxNyBKaUhvbmcgTGVlLlxyXG4gKiBNSVQgbGljZW5zZS5cclxuICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbmltcG9ydCB1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICAgIG5hbWU6ICdub3RpY2UnLFxyXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XHJcbiAgICAgICAgY29udGV4dC5ub3RpY2UgPSB7fTtcclxuXHJcbiAgICAgICAgLyoqIGRpYWxvZyAqL1xyXG4gICAgICAgIGxldCBub3RpY2VfZGl2ID0gdXRpbC5jcmVhdGVFbGVtZW50KCdESVYnKTtcclxuICAgICAgICBsZXQgbm90aWNlX3NwYW4gPSB1dGlsLmNyZWF0ZUVsZW1lbnQoJ1NQQU4nKTtcclxuICAgICAgICBsZXQgbm90aWNlX2J1dHRvbiA9IHV0aWwuY3JlYXRlRWxlbWVudCgnQlVUVE9OJyk7XHJcblxyXG4gICAgICAgIG5vdGljZV9kaXYuY2xhc3NOYW1lID0gJ3N1bi1lZGl0b3ItaWQtbm90aWNlJztcclxuICAgICAgICBub3RpY2VfYnV0dG9uLmNsYXNzTmFtZSA9ICdjbG9zZSc7XHJcbiAgICAgICAgbm90aWNlX2J1dHRvbi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnQ2xvc2UnKTtcclxuICAgICAgICBub3RpY2VfYnV0dG9uLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBjb3JlLmxhbmcuZGlhbG9nQm94LmNsb3NlKTtcclxuICAgICAgICBub3RpY2VfYnV0dG9uLmlubmVySFRNTCA9ICc8ZGl2IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtY29tbWFuZD1cImNsb3NlXCIgY2xhc3M9XCJpY29uLWNhbmNlbFwiPjwvZGl2Pic7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbm90aWNlX2Rpdi5hcHBlbmRDaGlsZChub3RpY2Vfc3Bhbik7XHJcbiAgICAgICAgbm90aWNlX2Rpdi5hcHBlbmRDaGlsZChub3RpY2VfYnV0dG9uKTtcclxuXHJcbiAgICAgICAgY29udGV4dC5ub3RpY2UubW9kYWwgPSBub3RpY2VfZGl2O1xyXG4gICAgICAgIGNvbnRleHQubm90aWNlLm1lc3NhZ2UgPSBub3RpY2Vfc3BhbjtcclxuXHJcbiAgICAgICAgLyoqIGFkZCBldmVudCBsaXN0ZW5lcnMgKi9cclxuICAgICAgICBub3RpY2VfYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrX2NhbmNlbC5iaW5kKGNvcmUpKTtcclxuICAgICAgICBcclxuICAgICAgICAvKiogYXBwZW5kIGh0bWwgKi9cclxuICAgICAgICBjb250ZXh0LmVsZW1lbnQuZWRpdG9yQXJlYS5pbnNlcnRCZWZvcmUobm90aWNlX2RpdiwgY29udGV4dC5lbGVtZW50Lnd5c2l3eWcpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8qKiBlbXB0eSBtZW1vcnkgKi9cclxuICAgICAgICBub3RpY2VfZGl2ID0gbnVsbDtcclxuICAgIH0sXHJcblxyXG4gICAgb25DbGlja19jYW5jZWw6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5zLm5vdGljZS5jbG9zZS5jYWxsKHRoaXMpO1xyXG4gICAgfSxcclxuXHJcbiAgICBvcGVuOiBmdW5jdGlvbiAodGV4dCkgIHtcclxuICAgICAgICB0aGlzLmNvbnRleHQubm90aWNlLm1lc3NhZ2UudGV4dENvbnRlbnQgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5ub3RpY2UubW9kYWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICB9LFxyXG5cclxuICAgIGNsb3NlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0Lm5vdGljZS5tb2RhbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59O1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUE5Q0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/plugins/modules/notice.js\n"); /***/ }), @@ -178,7 +178,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/util */ \"./src/lib/util.js\");\n/* harmony import */ var _lib_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/core */ \"./src/lib/core.js\");\n/* harmony import */ var _lib_constructor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/constructor */ \"./src/lib/constructor.js\");\n/* harmony import */ var _lib_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/context */ \"./src/lib/context.js\");\n/* harmony import */ var _lang_en__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lang/en */ \"./src/lang/en.js\");\n/*\n * wysiwyg web editor\n *\n * suneditor.js\n * Copyright 2017 JiHong Lee.\n * MIT license.\n */\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n /**\n * @description Returns the create function with preset options.\n * If the options overlap, the options of the 'create' function take precedence.\n * @param {Json} options - Initialization options\n * @returns {function}\n */\n init: function (init_options) {\n const self = this;\n return {\n create: function (idOrElement, options) {\n return self.create(idOrElement, options, init_options);\n }\n };\n },\n\n /**\n * @description Create the suneditor\n * @param {String|Element} idOrElement - textarea Id or textarea element\n * @param {Json} options - user options\n * @returns {{save: save, getContext: getContext, getContent: getContent, setContent: setContent, appendContent: appendContent, disabled: disabled, enabled: enabled, show: show, hide: hide, destroy: destroy}}\n */\n create: function (idOrElement, options, _init_options) {\n if (typeof options !== 'object') options = {};\n\n if (_init_options) {\n // options = Object.assign(util.copyObj(_init_options), options);\n options = [_lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(_init_options), options].reduce(function (init, option) {\n Object.keys(option).forEach(function (key) {\n init[key] = option[key];\n });\n return init;\n }, {});\n }\n\n const element = typeof idOrElement === 'string' ? document.getElementById(idOrElement) : idOrElement;\n\n if (!element) {\n if (typeof idOrElement === 'string') {\n throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:\"' + idOrElement + '\")');\n }\n\n throw Error('[SUNEDITOR.create.fail] suneditor requires textarea\\'s element or id value');\n }\n\n const cons = _lib_constructor__WEBPACK_IMPORTED_MODULE_2__[\"default\"].init(element, options, options.lang || _lang_en__WEBPACK_IMPORTED_MODULE_4__[\"default\"], options.plugins);\n\n if (cons.constructed._top.id && document.getElementById(cons.constructed._top.id)) {\n throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:\"' + cons.constructed._top.id + '\")');\n }\n\n element.style.display = 'none';\n cons.constructed._top.style.display = 'block';\n /** Create to sibling node */\n\n if (typeof element.nextElementSibling === 'object') {\n element.parentNode.insertBefore(cons.constructed._top, element.nextElementSibling);\n } else {\n element.parentNode.appendChild(cons.constructed._top);\n }\n\n return Object(_lib_core__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_lib_context__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(element, cons.constructed, cons.options), cons.plugins, cons.options.lang);\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3VuZWRpdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N1bmVkaXRvci5qcz9iNTliIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiB3eXNpd3lnIHdlYiBlZGl0b3JcbiAqXG4gKiBzdW5lZGl0b3IuanNcbiAqIENvcHlyaWdodCAyMDE3IEppSG9uZyBMZWUuXG4gKiBNSVQgbGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbCBmcm9tICcuL2xpYi91dGlsJztcbmltcG9ydCBjb3JlIGZyb20gJy4vbGliL2NvcmUnO1xuaW1wb3J0IF9Db25zdHJ1Y3RvciBmcm9tICcuL2xpYi9jb25zdHJ1Y3Rvcic7XG5pbXBvcnQgX0NvbnRleHQgZnJvbSAnLi9saWIvY29udGV4dCc7XG5pbXBvcnQgX2RlZmF1bHRMYW5nIGZyb20gJy4vbGFuZy9lbic7XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjcmVhdGUgZnVuY3Rpb24gd2l0aCBwcmVzZXQgb3B0aW9ucy5cbiAgICAgKiBJZiB0aGUgb3B0aW9ucyBvdmVybGFwLCB0aGUgb3B0aW9ucyBvZiB0aGUgJ2NyZWF0ZScgZnVuY3Rpb24gdGFrZSBwcmVjZWRlbmNlLlxuICAgICAqIEBwYXJhbSB7SnNvbn0gb3B0aW9ucyAtIEluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24gKGluaXRfb3B0aW9ucykge1xuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoaWRPckVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGUoaWRPckVsZW1lbnQsIG9wdGlvbnMsIGluaXRfb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGhlIHN1bmVkaXRvclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEVsZW1lbnR9IGlkT3JFbGVtZW50IC0gdGV4dGFyZWEgSWQgb3IgdGV4dGFyZWEgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SnNvbn0gb3B0aW9ucyAtIHVzZXIgb3B0aW9uc1xuICAgICAqIEByZXR1cm5zIHt7c2F2ZTogc2F2ZSwgZ2V0Q29udGV4dDogZ2V0Q29udGV4dCwgZ2V0Q29udGVudDogZ2V0Q29udGVudCwgc2V0Q29udGVudDogc2V0Q29udGVudCwgYXBwZW5kQ29udGVudDogYXBwZW5kQ29udGVudCwgZGlzYWJsZWQ6IGRpc2FibGVkLCBlbmFibGVkOiBlbmFibGVkLCBzaG93OiBzaG93LCBoaWRlOiBoaWRlLCBkZXN0cm95OiBkZXN0cm95fX1cbiAgICAgKi9cbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChpZE9yRWxlbWVudCwgb3B0aW9ucywgX2luaXRfb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSBvcHRpb25zID0ge307XG4gICAgICAgIGlmIChfaW5pdF9vcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih1dGlsLmNvcHlPYmooX2luaXRfb3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICAgICAgb3B0aW9ucyA9ICBbdXRpbC5jb3B5T2JqKF9pbml0X29wdGlvbnMpLCBvcHRpb25zXS5yZWR1Y2UoZnVuY3Rpb24gKGluaXQsIG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRba2V5XSA9IG9wdGlvbltrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGlkT3JFbGVtZW50ID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkT3JFbGVtZW50KSA6IGlkT3JFbGVtZW50O1xuXG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZE9yRWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jcmVhdGUuZmFpbF0gVGhlIGVsZW1lbnQgZm9yIHRoYXQgaWQgd2FzIG5vdCBmb3VuZCAoSUQ6XCInICsgaWRPckVsZW1lbnQgKyAnXCIpJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNyZWF0ZS5mYWlsXSBzdW5lZGl0b3IgcmVxdWlyZXMgdGV4dGFyZWFcXCdzIGVsZW1lbnQgb3IgaWQgdmFsdWUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnMgPSBfQ29uc3RydWN0b3IuaW5pdChlbGVtZW50LCBvcHRpb25zLCAob3B0aW9ucy5sYW5nIHx8ICBfZGVmYXVsdExhbmcpLCBvcHRpb25zLnBsdWdpbnMpO1xuXG4gICAgICAgIGlmIChjb25zLmNvbnN0cnVjdGVkLl90b3AuaWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29ucy5jb25zdHJ1Y3RlZC5fdG9wLmlkKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuY3JlYXRlLmZhaWxdIFRoZSBJRCBvZiB0aGUgc3VuZWRpdG9yIHlvdSBhcmUgdHJ5aW5nIHRvIGNyZWF0ZSBhbHJlYWR5IGV4aXN0cyAoSUQ6XCInICsgY29ucy5jb25zdHJ1Y3RlZC5fdG9wLmlkICsgJ1wiKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zLmNvbnN0cnVjdGVkLl90b3Auc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgLyoqIENyZWF0ZSB0byBzaWJsaW5nIG5vZGUgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29ucy5jb25zdHJ1Y3RlZC5fdG9wLCBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY29ucy5jb25zdHJ1Y3RlZC5fdG9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3JlKF9Db250ZXh0KGVsZW1lbnQsIGNvbnMuY29uc3RydWN0ZWQsIGNvbnMub3B0aW9ucyksIGNvbnMucGx1Z2lucywgY29ucy5vcHRpb25zLmxhbmcpO1xuICAgIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBOzs7Ozs7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTlEQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/suneditor.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/util */ \"./src/lib/util.js\");\n/* harmony import */ var _lib_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/core */ \"./src/lib/core.js\");\n/* harmony import */ var _lib_constructor__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/constructor */ \"./src/lib/constructor.js\");\n/* harmony import */ var _lib_context__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/context */ \"./src/lib/context.js\");\n/* harmony import */ var _lang_en__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lang/en */ \"./src/lang/en.js\");\n/*\r\n * wysiwyg web editor\r\n *\r\n * suneditor.js\r\n * Copyright 2017 JiHong Lee.\r\n * MIT license.\r\n */\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n /**\r\n * @description Returns the create function with preset options.\r\n * If the options overlap, the options of the 'create' function take precedence.\r\n * @param {Json} options - Initialization options\r\n * @returns {function}\r\n */\n init: function (init_options) {\n const self = this;\n return {\n create: function (idOrElement, options) {\n return self.create(idOrElement, options, init_options);\n }\n };\n },\n\n /**\r\n * @description Create the suneditor\r\n * @param {String|Element} idOrElement - textarea Id or textarea element\r\n * @param {Json} options - user options\r\n * @returns {{save: save, getContext: getContext, getContent: getContent, setContent: setContent, appendContent: appendContent, disabled: disabled, enabled: enabled, show: show, hide: hide, destroy: destroy}}\r\n */\n create: function (idOrElement, options, _init_options) {\n if (typeof options !== 'object') options = {};\n\n if (_init_options) {\n // options = Object.assign(util.copyObj(_init_options), options);\n options = [_lib_util__WEBPACK_IMPORTED_MODULE_0__[\"default\"].copyObj(_init_options), options].reduce(function (init, option) {\n Object.keys(option).forEach(function (key) {\n init[key] = option[key];\n });\n return init;\n }, {});\n }\n\n const element = typeof idOrElement === 'string' ? document.getElementById(idOrElement) : idOrElement;\n\n if (!element) {\n if (typeof idOrElement === 'string') {\n throw Error('[SUNEDITOR.create.fail] The element for that id was not found (ID:\"' + idOrElement + '\")');\n }\n\n throw Error('[SUNEDITOR.create.fail] suneditor requires textarea\\'s element or id value');\n }\n\n const cons = _lib_constructor__WEBPACK_IMPORTED_MODULE_2__[\"default\"].init(element, options, options.lang || _lang_en__WEBPACK_IMPORTED_MODULE_4__[\"default\"], options.plugins);\n\n if (cons.constructed._top.id && document.getElementById(cons.constructed._top.id)) {\n throw Error('[SUNEDITOR.create.fail] The ID of the suneditor you are trying to create already exists (ID:\"' + cons.constructed._top.id + '\")');\n }\n\n element.style.display = 'none';\n cons.constructed._top.style.display = 'block';\n /** Create to sibling node */\n\n if (typeof element.nextElementSibling === 'object') {\n element.parentNode.insertBefore(cons.constructed._top, element.nextElementSibling);\n } else {\n element.parentNode.appendChild(cons.constructed._top);\n }\n\n return Object(_lib_core__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(Object(_lib_context__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(element, cons.constructed, cons.options), cons.plugins, cons.options.lang);\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc3VuZWRpdG9yLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N1bmVkaXRvci5qcz9iNTliIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIHd5c2l3eWcgd2ViIGVkaXRvclxyXG4gKlxyXG4gKiBzdW5lZGl0b3IuanNcclxuICogQ29weXJpZ2h0IDIwMTcgSmlIb25nIExlZS5cclxuICogTUlUIGxpY2Vuc2UuXHJcbiAqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5pbXBvcnQgdXRpbCBmcm9tICcuL2xpYi91dGlsJztcclxuaW1wb3J0IGNvcmUgZnJvbSAnLi9saWIvY29yZSc7XHJcbmltcG9ydCBfQ29uc3RydWN0b3IgZnJvbSAnLi9saWIvY29uc3RydWN0b3InO1xyXG5pbXBvcnQgX0NvbnRleHQgZnJvbSAnLi9saWIvY29udGV4dCc7XHJcbmltcG9ydCBfZGVmYXVsdExhbmcgZnJvbSAnLi9sYW5nL2VuJztcclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSBjcmVhdGUgZnVuY3Rpb24gd2l0aCBwcmVzZXQgb3B0aW9ucy5cclxuICAgICAqIElmIHRoZSBvcHRpb25zIG92ZXJsYXAsIHRoZSBvcHRpb25zIG9mIHRoZSAnY3JlYXRlJyBmdW5jdGlvbiB0YWtlIHByZWNlZGVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge0pzb259IG9wdGlvbnMgLSBJbml0aWFsaXphdGlvbiBvcHRpb25zXHJcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIGluaXQ6IGZ1bmN0aW9uIChpbml0X29wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3JlYXRlOiBmdW5jdGlvbiAoaWRPckVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZShpZE9yRWxlbWVudCwgb3B0aW9ucywgaW5pdF9vcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSB0aGUgc3VuZWRpdG9yXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fSBpZE9yRWxlbWVudCAtIHRleHRhcmVhIElkIG9yIHRleHRhcmVhIGVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7SnNvbn0gb3B0aW9ucyAtIHVzZXIgb3B0aW9uc1xyXG4gICAgICogQHJldHVybnMge3tzYXZlOiBzYXZlLCBnZXRDb250ZXh0OiBnZXRDb250ZXh0LCBnZXRDb250ZW50OiBnZXRDb250ZW50LCBzZXRDb250ZW50OiBzZXRDb250ZW50LCBhcHBlbmRDb250ZW50OiBhcHBlbmRDb250ZW50LCBkaXNhYmxlZDogZGlzYWJsZWQsIGVuYWJsZWQ6IGVuYWJsZWQsIHNob3c6IHNob3csIGhpZGU6IGhpZGUsIGRlc3Ryb3k6IGRlc3Ryb3l9fVxyXG4gICAgICovXHJcbiAgICBjcmVhdGU6IGZ1bmN0aW9uIChpZE9yRWxlbWVudCwgb3B0aW9ucywgX2luaXRfb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIG9wdGlvbnMgPSB7fTtcclxuICAgICAgICBpZiAoX2luaXRfb3B0aW9ucykge1xyXG4gICAgICAgICAgICAvLyBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih1dGlsLmNvcHlPYmooX2luaXRfb3B0aW9ucyksIG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBvcHRpb25zID0gIFt1dGlsLmNvcHlPYmooX2luaXRfb3B0aW9ucyksIG9wdGlvbnNdLnJlZHVjZShmdW5jdGlvbiAoaW5pdCwgb3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRba2V5XSA9IG9wdGlvbltrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGlkT3JFbGVtZW50ID09PSAnc3RyaW5nJyA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkT3JFbGVtZW50KSA6IGlkT3JFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZE9yRWxlbWVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdbU1VORURJVE9SLmNyZWF0ZS5mYWlsXSBUaGUgZWxlbWVudCBmb3IgdGhhdCBpZCB3YXMgbm90IGZvdW5kIChJRDpcIicgKyBpZE9yRWxlbWVudCArICdcIiknKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1tTVU5FRElUT1IuY3JlYXRlLmZhaWxdIHN1bmVkaXRvciByZXF1aXJlcyB0ZXh0YXJlYVxcJ3MgZWxlbWVudCBvciBpZCB2YWx1ZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29ucyA9IF9Db25zdHJ1Y3Rvci5pbml0KGVsZW1lbnQsIG9wdGlvbnMsIChvcHRpb25zLmxhbmcgfHwgIF9kZWZhdWx0TGFuZyksIG9wdGlvbnMucGx1Z2lucyk7XHJcblxyXG4gICAgICAgIGlmIChjb25zLmNvbnN0cnVjdGVkLl90b3AuaWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29ucy5jb25zdHJ1Y3RlZC5fdG9wLmlkKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignW1NVTkVESVRPUi5jcmVhdGUuZmFpbF0gVGhlIElEIG9mIHRoZSBzdW5lZGl0b3IgeW91IGFyZSB0cnlpbmcgdG8gY3JlYXRlIGFscmVhZHkgZXhpc3RzIChJRDpcIicgKyBjb25zLmNvbnN0cnVjdGVkLl90b3AuaWQgKyAnXCIpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgY29ucy5jb25zdHJ1Y3RlZC5fdG9wLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAvKiogQ3JlYXRlIHRvIHNpYmxpbmcgbm9kZSAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY29ucy5jb25zdHJ1Y3RlZC5fdG9wLCBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZWxlbWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNvbnMuY29uc3RydWN0ZWQuX3RvcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY29yZShfQ29udGV4dChlbGVtZW50LCBjb25zLmNvbnN0cnVjdGVkLCBjb25zLm9wdGlvbnMpLCBjb25zLnBsdWdpbnMsIGNvbnMub3B0aW9ucy5sYW5nKTtcclxuICAgIH1cclxufTtcclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5REEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/suneditor.js\n"); /***/ }), @@ -190,7 +190,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _lib /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n // ex) A submenu plugin that appends the contents of the input element to the editor\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n // plugin name (Required)\n name: 'custom_plugin_submenu',\n // add function - It is called only once when the plugin is first run.\n // This function generates HTML to append and register the event.\n // arguments - (core : core object, targetElement : clicked button element)\n add: function (core, targetElement) {\n // Registering a namespace for caching as a plugin name in the context object\n const context = core.context;\n context.custom = {\n textElement: null\n }; // Generate submenu HTML\n\n let listDiv = eval(this.setSubmenu(core.lang)); // Input tag caching\n\n context.custom.textElement = listDiv.getElementsByTagName('INPUT')[0]; // In addition to the button, elements that should operate within the submenu, such as focus,\n // must call stopPropagation in the mousedown event to prevent the toolbar from executing events.\n\n context.custom.textElement.addEventListener('mousedown', function (e) {\n e.stopPropagation();\n }); // You must bind \"core\" object when registering an event.\n\n /** add event listeners */\n\n listDiv.getElementsByTagName('BUTTON')[0].addEventListener('click', this.onClick.bind(core));\n context.custom.textElement.addEventListener('mousedown', function () {});\n /** append html */\n\n targetElement.parentNode.appendChild(listDiv);\n },\n setSubmenu: function () {\n const listDiv = document.createElement('DIV');\n listDiv.className = 'sun-editor-submenu layer_editor layer_align';\n listDiv.style.display = 'none';\n listDiv.innerHTML = '' + '
    ' + '
      ' + '
    • ' + '
    • ' + '
    ' + '
    ';\n return listDiv;\n },\n onClick: function () {\n // Get Input value\n const value = document.createTextNode(this.context.custom.textElement.value); // insert\n\n this.insertNode(value); // focus\n\n this.focus();\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi90ZXN0L2Rldi9jdXN0b21fcGx1Z2luX3N1Ym1lbnUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi90ZXN0L2Rldi9jdXN0b21fcGx1Z2luX3N1Ym1lbnUuanM/NjAwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8vIGV4KSBBIHN1Ym1lbnUgcGx1Z2luIHRoYXQgYXBwZW5kcyB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IGVsZW1lbnQgdG8gdGhlIGVkaXRvclxuZXhwb3J0IGRlZmF1bHQge1xuICAgIC8vIHBsdWdpbiBuYW1lIChSZXF1aXJlZClcbiAgICBuYW1lOiAnY3VzdG9tX3BsdWdpbl9zdWJtZW51JyxcblxuICAgIC8vIGFkZCBmdW5jdGlvbiAtIEl0IGlzIGNhbGxlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgcGx1Z2luIGlzIGZpcnN0IHJ1bi5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBIVE1MIHRvIGFwcGVuZCBhbmQgcmVnaXN0ZXIgdGhlIGV2ZW50LlxuICAgIC8vIGFyZ3VtZW50cyAtIChjb3JlIDogY29yZSBvYmplY3QsIHRhcmdldEVsZW1lbnQgOiBjbGlja2VkIGJ1dHRvbiBlbGVtZW50KVxuICAgIGFkZDogZnVuY3Rpb24gKGNvcmUsIHRhcmdldEVsZW1lbnQpIHtcblxuICAgICAgICAvLyBSZWdpc3RlcmluZyBhIG5hbWVzcGFjZSBmb3IgY2FjaGluZyBhcyBhIHBsdWdpbiBuYW1lIGluIHRoZSBjb250ZXh0IG9iamVjdFxuICAgICAgICBjb25zdCBjb250ZXh0ID0gY29yZS5jb250ZXh0O1xuICAgICAgICBjb250ZXh0LmN1c3RvbSA9IHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgc3VibWVudSBIVE1MXG4gICAgICAgIGxldCBsaXN0RGl2ID0gZXZhbCh0aGlzLnNldFN1Ym1lbnUoY29yZS5sYW5nKSk7XG5cbiAgICAgICAgLy8gSW5wdXQgdGFnIGNhY2hpbmdcbiAgICAgICAgY29udGV4dC5jdXN0b20udGV4dEVsZW1lbnQgPSBsaXN0RGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdJTlBVVCcpWzBdO1xuXG4gICAgICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBidXR0b24sIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG9wZXJhdGUgd2l0aGluIHRoZSBzdWJtZW51LCBzdWNoIGFzIGZvY3VzLFxuICAgICAgICAvLyBtdXN0IGNhbGwgc3RvcFByb3BhZ2F0aW9uIGluIHRoZSBtb3VzZWRvd24gZXZlbnQgdG8gcHJldmVudCB0aGUgdG9vbGJhciBmcm9tIGV4ZWN1dGluZyBldmVudHMuXG4gICAgICAgIGNvbnRleHQuY3VzdG9tLnRleHRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBZb3UgbXVzdCBiaW5kIFwiY29yZVwiIG9iamVjdCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50LlxuICAgICAgICAvKiogYWRkIGV2ZW50IGxpc3RlbmVycyAqL1xuICAgICAgICBsaXN0RGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdCVVRUT04nKVswXS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGljay5iaW5kKGNvcmUpKTtcbiAgICAgICAgY29udGV4dC5jdXN0b20udGV4dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKiBhcHBlbmQgaHRtbCAqL1xuICAgICAgICB0YXJnZXRFbGVtZW50LnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobGlzdERpdik7XG4gICAgfSxcblxuICAgIHNldFN1Ym1lbnU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAgIGxpc3REaXYuY2xhc3NOYW1lID0gJ3N1bi1lZGl0b3Itc3VibWVudSBsYXllcl9lZGl0b3IgbGF5ZXJfYWxpZ24nO1xuICAgICAgICBsaXN0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGxpc3REaXYuaW5uZXJIVE1MID0gJycgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJpbm5lcl9sYXllclwiPicgK1xuICAgICAgICAgICAgJyAgIDx1bCBjbGFzcz1cImxpc3RfZWRpdG9yXCI+JyArXG4gICAgICAgICAgICAnICAgICAgIDxsaT48aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImluc2VydCB0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyOiAxcHggc29saWQgI0NDQztcIiAvPjwvbGk+JyArXG4gICAgICAgICAgICAnICAgICAgIDxsaT48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bl9lZGl0b3JcIiB0aXRsZT1cIkFwcGVuZCB0ZXh0XCI+QXBwZW5kIHRleHQ8L2J1dHRvbj48L2xpPicgK1xuICAgICAgICAgICAgJyAgIDwvdWw+JyArXG4gICAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICByZXR1cm4gbGlzdERpdjtcbiAgICB9LFxuXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBHZXQgSW5wdXQgdmFsdWVcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbnRleHQuY3VzdG9tLnRleHRFbGVtZW50LnZhbHVlKTtcblxuICAgICAgICAvLyBpbnNlcnRcbiAgICAgICAgdGhpcy5pbnNlcnROb2RlKHZhbHVlKTtcblxuICAgICAgICAvLyBmb2N1c1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxufTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQS9EQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./test/dev/custom_plugin_submenu.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n // ex) A submenu plugin that appends the contents of the input element to the editor\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n // plugin name (Required)\n name: 'custom_plugin_submenu',\n // add function - It is called only once when the plugin is first run.\n // This function generates HTML to append and register the event.\n // arguments - (core : core object, targetElement : clicked button element)\n add: function (core, targetElement) {\n // Registering a namespace for caching as a plugin name in the context object\n const context = core.context;\n context.custom = {\n textElement: null\n }; // Generate submenu HTML\n\n let listDiv = eval(this.setSubmenu(core.lang)); // Input tag caching\n\n context.custom.textElement = listDiv.getElementsByTagName('INPUT')[0]; // In addition to the button, elements that should operate within the submenu, such as focus,\n // must call stopPropagation in the mousedown event to prevent the toolbar from executing events.\n\n context.custom.textElement.addEventListener('mousedown', function (e) {\n e.stopPropagation();\n }); // You must bind \"core\" object when registering an event.\n\n /** add event listeners */\n\n listDiv.getElementsByTagName('BUTTON')[0].addEventListener('click', this.onClick.bind(core));\n context.custom.textElement.addEventListener('mousedown', function () {});\n /** append html */\n\n targetElement.parentNode.appendChild(listDiv);\n },\n setSubmenu: function () {\n const listDiv = document.createElement('DIV');\n listDiv.className = 'sun-editor-submenu layer_editor layer_align';\n listDiv.style.display = 'none';\n listDiv.innerHTML = '' + '
    ' + '
      ' + '
    • ' + '
    • ' + '
    ' + '
    ';\n return listDiv;\n },\n onClick: function () {\n // Get Input value\n const value = document.createTextNode(this.context.custom.textElement.value); // insert\n\n this.insertNode(value); // focus\n\n this.focus();\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi90ZXN0L2Rldi9jdXN0b21fcGx1Z2luX3N1Ym1lbnUuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi90ZXN0L2Rldi9jdXN0b21fcGx1Z2luX3N1Ym1lbnUuanM/NjAwZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XHJcblxyXG4vLyBleCkgQSBzdWJtZW51IHBsdWdpbiB0aGF0IGFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBlbGVtZW50IHRvIHRoZSBlZGl0b3JcclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgLy8gcGx1Z2luIG5hbWUgKFJlcXVpcmVkKVxyXG4gICAgbmFtZTogJ2N1c3RvbV9wbHVnaW5fc3VibWVudScsXHJcblxyXG4gICAgLy8gYWRkIGZ1bmN0aW9uIC0gSXQgaXMgY2FsbGVkIG9ubHkgb25jZSB3aGVuIHRoZSBwbHVnaW4gaXMgZmlyc3QgcnVuLlxyXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgSFRNTCB0byBhcHBlbmQgYW5kIHJlZ2lzdGVyIHRoZSBldmVudC5cclxuICAgIC8vIGFyZ3VtZW50cyAtIChjb3JlIDogY29yZSBvYmplY3QsIHRhcmdldEVsZW1lbnQgOiBjbGlja2VkIGJ1dHRvbiBlbGVtZW50KVxyXG4gICAgYWRkOiBmdW5jdGlvbiAoY29yZSwgdGFyZ2V0RWxlbWVudCkge1xyXG5cclxuICAgICAgICAvLyBSZWdpc3RlcmluZyBhIG5hbWVzcGFjZSBmb3IgY2FjaGluZyBhcyBhIHBsdWdpbiBuYW1lIGluIHRoZSBjb250ZXh0IG9iamVjdFxyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBjb3JlLmNvbnRleHQ7XHJcbiAgICAgICAgY29udGV4dC5jdXN0b20gPSB7XHJcbiAgICAgICAgICAgIHRleHRFbGVtZW50OiBudWxsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gR2VuZXJhdGUgc3VibWVudSBIVE1MXHJcbiAgICAgICAgbGV0IGxpc3REaXYgPSBldmFsKHRoaXMuc2V0U3VibWVudShjb3JlLmxhbmcpKTtcclxuXHJcbiAgICAgICAgLy8gSW5wdXQgdGFnIGNhY2hpbmdcclxuICAgICAgICBjb250ZXh0LmN1c3RvbS50ZXh0RWxlbWVudCA9IGxpc3REaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0lOUFVUJylbMF07XHJcblxyXG4gICAgICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBidXR0b24sIGVsZW1lbnRzIHRoYXQgc2hvdWxkIG9wZXJhdGUgd2l0aGluIHRoZSBzdWJtZW51LCBzdWNoIGFzIGZvY3VzLFxyXG4gICAgICAgIC8vIG11c3QgY2FsbCBzdG9wUHJvcGFnYXRpb24gaW4gdGhlIG1vdXNlZG93biBldmVudCB0byBwcmV2ZW50IHRoZSB0b29sYmFyIGZyb20gZXhlY3V0aW5nIGV2ZW50cy5cclxuICAgICAgICBjb250ZXh0LmN1c3RvbS50ZXh0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBZb3UgbXVzdCBiaW5kIFwiY29yZVwiIG9iamVjdCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50LlxyXG4gICAgICAgIC8qKiBhZGQgZXZlbnQgbGlzdGVuZXJzICovXHJcbiAgICAgICAgbGlzdERpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQlVUVE9OJylbMF0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uQ2xpY2suYmluZChjb3JlKSk7XHJcbiAgICAgICAgY29udGV4dC5jdXN0b20udGV4dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLyoqIGFwcGVuZCBodG1sICovXHJcbiAgICAgICAgdGFyZ2V0RWxlbWVudC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGxpc3REaXYpO1xyXG4gICAgfSxcclxuXHJcbiAgICBzZXRTdWJtZW51OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgbGlzdERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xyXG5cclxuICAgICAgICBsaXN0RGl2LmNsYXNzTmFtZSA9ICdzdW4tZWRpdG9yLXN1Ym1lbnUgbGF5ZXJfZWRpdG9yIGxheWVyX2FsaWduJztcclxuICAgICAgICBsaXN0RGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgbGlzdERpdi5pbm5lckhUTUwgPSAnJyArXHJcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwiaW5uZXJfbGF5ZXJcIj4nICtcclxuICAgICAgICAgICAgJyAgIDx1bCBjbGFzcz1cImxpc3RfZWRpdG9yXCI+JyArXHJcbiAgICAgICAgICAgICcgICAgICAgPGxpPjxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiaW5zZXJ0IHRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXI6IDFweCBzb2xpZCAjQ0NDO1wiIC8+PC9saT4nICtcclxuICAgICAgICAgICAgJyAgICAgICA8bGk+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG5fZWRpdG9yXCIgdGl0bGU9XCJBcHBlbmQgdGV4dFwiPkFwcGVuZCB0ZXh0PC9idXR0b24+PC9saT4nICtcclxuICAgICAgICAgICAgJyAgIDwvdWw+JyArXHJcbiAgICAgICAgICAgICc8L2Rpdj4nO1xyXG5cclxuICAgICAgICByZXR1cm4gbGlzdERpdjtcclxuICAgIH0sXHJcblxyXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIC8vIEdldCBJbnB1dCB2YWx1ZVxyXG4gICAgICAgIGNvbnN0IHZhbHVlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jb250ZXh0LmN1c3RvbS50ZXh0RWxlbWVudC52YWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIGluc2VydFxyXG4gICAgICAgIHRoaXMuaW5zZXJ0Tm9kZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgIC8vIGZvY3VzXHJcbiAgICAgICAgdGhpcy5mb2N1cygpO1xyXG4gICAgfVxyXG59OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBL0RBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./test/dev/custom_plugin_submenu.js\n"); /***/ })