M TODO => TODO +0 -1
@@ 3,7 3,6 @@ Testing: 100% happy path and 80% total
Documentation
Pages: Doc, Contact, FAQ, Terms, Privacy, Tour
Depth option on APIs
-When editing existing references don't blow away prev inputs
Forgot password
Warn & delete excess users/spaces on downgrade.
Cache: org?, invite?, role?, hook
M internal/c/content/content.go => internal/c/content/content.go +12 -3
@@ 9,6 9,7 @@ import (
"net/url"
"strconv"
"strings"
+ "time"
"git.sr.ht/~evanj/cms/internal/c"
"git.sr.ht/~evanj/cms/internal/m/content"
@@ 31,6 32,14 @@ var (
ErrNoC = errors.New("failed to find desired content")
)
+// bgctx is used to send requests to external servers outside of
+// request/response handling. External server requests have a timeout of ten
+// seconds.
+func bgctx() context.Context {
+ ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
+ return ctx
+}
+
type Content struct {
*c.Controller
log *log.Logger
@@ 193,7 202,7 @@ func (c *Content) create(w http.ResponseWriter, r *http.Request) {
return
}
- go c.hook.Do(r.Context(), user, space, content, webhook.HookNew)
+ go c.hook.Do(bgctx(), user, space, content, webhook.HookNew)
url := fmt.Sprintf("/content/%s/%s/%s", space.ID(), ct.ID(), content.ID())
c.Redirect(w, r, url)
@@ 367,7 376,7 @@ func (c *Content) update(w http.ResponseWriter, r *http.Request) {
return
}
- go c.hook.Do(r.Context(), user, space, content, webhook.HookUpdate)
+ go c.hook.Do(bgctx(), user, space, content, webhook.HookUpdate)
url := fmt.Sprintf("/content/%s/%s/%s", space.ID(), ct.ID(), content.ID())
c.Redirect(w, r, url)
@@ 389,7 398,7 @@ func (c *Content) delete(w http.ResponseWriter, r *http.Request) {
return
}
- go c.hook.Do(r.Context(), user, space, content, webhook.HookDelete)
+ go c.hook.Do(bgctx(), user, space, content, webhook.HookDelete)
url := fmt.Sprintf("/contenttype/%s/%s", space.ID(), ct.ID())
c.Redirect(w, r, url)
M internal/s/db/content.go => internal/s/db/content.go +12 -10
@@ 36,6 36,13 @@ func orderTypeReverse(o OrderType) OrderType {
}
}
+func strsplit(str string, splitby string) []string {
+ if str == "" {
+ return []string{}
+ }
+ return strings.Split(str, splitby)
+}
+
type Content struct {
// In DB.
ContentID string
@@ 357,10 364,6 @@ var (
)
func (db *DB) valueReferenceListUpdate(ctx context.Context, s space.Space, ct contenttype.ContentType, c *Content, t *sql.Tx, valueID string, IDs []string, depth int) error {
- if len(IDs) < 1 {
- return fmt.Errorf("reference list type has no values")
- }
-
// wipe out old list values
// create new list values
// TODO: Remove these inline queries, please.
@@ 373,6 376,10 @@ func (db *DB) valueReferenceListUpdate(ctx context.Context, s space.Space, ct co
return fmt.Errorf("failed to remove old reference list values before update")
}
+ if len(IDs) < 1 {
+ return nil
+ }
+
var value ContentValue
value.FieldValue = strings.Join(IDs, "-") // Match what client should send us.
if err := t.QueryRowContext(ctx, queryValueGetReferenceListByID, valueID).Scan(&value.FieldID, &value.FieldType, &value.FieldName); err != nil {
@@ 650,12 657,7 @@ func (db *DB) contentUpdate(ctx context.Context, t *sql.Tx, space space.Space, c
for _, item := range updateParams {
// Special data type. Life is hard.
if item.Type == valuetype.ReferenceList {
- if item.Value == "" {
- // Usually a full space copy after referenced content has been deleted.
- continue
- }
-
- if err := db.valueReferenceListUpdate(ctx, space, ct, c, t, item.ID, strings.Split(item.Value, "-"), depth); err != nil {
+ if err := db.valueReferenceListUpdate(ctx, space, ct, c, t, item.ID, strsplit(item.Value, "-"), depth); err != nil {
return err
}
continue
M internal/s/db/contenttype.go => internal/s/db/contenttype.go +0 -1
@@ 87,7 87,6 @@ func (db *DB) ContentTypeNew(ctx context.Context, u user.User, space space.Space
}
for _, item := range params {
- db.log.Println(item, id)
if _, err := t.ExecContext(ctx, queryCreateContentTypeConnection, item.Name, id, item.Type); err != nil {
return nil, fmt.Errorf("failed to create field(s)")
}
M internal/v/js/content.js => internal/v/js/content.js +19 -3
@@ 95,9 95,25 @@
var autoC = {autocomplete:{destroy:function(){}}};
var isList = ref.className.indexOf('ref-list') != -1;
- var chosenContentTypeID // used by both
- var chosenContentIDs = [] // only used be ref list
- var chosenContentNames = [] // only used be ref list
+ var chosenContentTypeID; // used by both
+ var chosenContentIDs = []; // only used be ref list
+ var chosenContentNames = []; // only used be ref list
+
+ // *Shutters*
+ {{if .Content}}
+ {{range $key, $val := .Content.Values}}
+ {{if eq $val.Type "ReferenceList"}}
+ {{range $key, $val := $val.FieldReferenceList}}
+ chosenContentIDs.push({{$val.ContentID}});
+ {{range $key, $val := $val.ContentValues}}
+ {{if eq $val.FieldName "name"}}
+ chosenContentNames.push({{.FieldValue}});
+ {{end}}
+ {{end}}
+ {{end}}
+ {{end}}
+ {{end}}
+ {{end}}
modal.addEventListener('shown.bs.modal', function() {
var opts = {
M internal/v/tmpls_embed.go => internal/v/tmpls_embed.go +1 -1
@@ 60,7 60,7 @@ func init() {
tmpls["js/bootstrap.js"] = tostring("LyohCiAgKiBCb290c3RyYXAgdjUuMC4wLWFscGhhMSAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLykKICAqIENvcHlyaWdodCAyMDExLTIwMjAgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycykKICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKQogICovCiFmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgZXhwb3J0cyYmInVuZGVmaW5lZCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZShyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJwb3BwZXIuanMiXSxlKToodD10fHxzZWxmKS5ib290c3RyYXA9ZSh0LlBvcHBlcil9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gbih0LG4saSl7cmV0dXJuIG4mJmUodC5wcm90b3R5cGUsbiksaSYmZSh0LGkpLHR9ZnVuY3Rpb24gaSh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9ZnVuY3Rpb24gbyh0LGUpe3ZhciBuPU9iamVjdC5rZXlzKHQpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7ZSYmKGk9aS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4saSl9cmV0dXJuIG59ZnVuY3Rpb24gcyh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2UlMj9vKE9iamVjdChuKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aSh0LGUsbltlXSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXModCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSk6byhPYmplY3QobikpLmZvckVhY2goKGZ1bmN0aW9uKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLGUpKX0pKX1yZXR1cm4gdH10PXQmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCJkZWZhdWx0Iik/dC5kZWZhdWx0OnQ7dmFyIHIsYSxsLGMsdT1mdW5jdGlvbih0KXtkb3t0Kz1NYXRoLmZsb29yKDFlNipNYXRoLnJhbmRvbSgpKX13aGlsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KSk7cmV0dXJuIHR9LGg9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoImRhdGEtdGFyZ2V0Iik7aWYoIWV8fCIjIj09PWUpe3ZhciBuPXQuZ2V0QXR0cmlidXRlKCJocmVmIik7ZT1uJiYiIyIhPT1uP24udHJpbSgpOm51bGx9cmV0dXJuIGV9LGY9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZSYmZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKT9lOm51bGx9LGQ9ZnVuY3Rpb24odCl7dmFyIGU9aCh0KTtyZXR1cm4gZT9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpOm51bGx9LGc9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIDA7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCksbj1lLnRyYW5zaXRpb25EdXJhdGlvbixpPWUudHJhbnNpdGlvbkRlbGF5LG89cGFyc2VGbG9hdChuKSxzPXBhcnNlRmxvYXQoaSk7cmV0dXJuIG98fHM/KG49bi5zcGxpdCgiLCIpWzBdLGk9aS5zcGxpdCgiLCIpWzBdLDFlMyoocGFyc2VGbG9hdChuKStwYXJzZUZsb2F0KGkpKSk6MH0scD1mdW5jdGlvbih0KXt0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCJ0cmFuc2l0aW9uZW5kIikpfSxtPWZ1bmN0aW9uKHQpe3JldHVybih0WzBdfHx0KS5ub2RlVHlwZX0sXz1mdW5jdGlvbih0LGUpe3ZhciBuPSExLGk9ZSs1O3QuYWRkRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uIGUoKXtuPSEwLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidHJhbnNpdGlvbmVuZCIsZSl9KSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtufHxwKHQpfSksaSl9LHY9ZnVuY3Rpb24odCxlLG4pe09iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciBvLHM9bltpXSxyPWVbaV0sYT1yJiZtKHIpPyJlbGVtZW50IjpudWxsPT0obz1yKT8iIitvOnt9LnRvU3RyaW5nLmNhbGwobykubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKTtpZighbmV3IFJlZ0V4cChzKS50ZXN0KGEpKXRocm93IG5ldyBFcnJvcih0LnRvVXBwZXJDYXNlKCkrJzogT3B0aW9uICInK2krJyIgcHJvdmlkZWQgdHlwZSAiJythKyciIGJ1dCBleHBlY3RlZCB0eXBlICInK3MrJyIuJyl9KSl9LGI9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7aWYodC5zdHlsZSYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc3R5bGUpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCksbj1nZXRDb21wdXRlZFN0eWxlKHQucGFyZW50Tm9kZSk7cmV0dXJuIm5vbmUiIT09ZS5kaXNwbGF5JiYibm9uZSIhPT1uLmRpc3BsYXkmJiJoaWRkZW4iIT09ZS52aXNpYmlsaXR5fXJldHVybiExfSx5PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7fX0sdz1mdW5jdGlvbih0KXtyZXR1cm4gdC5vZmZzZXRIZWlnaHR9LEU9ZnVuY3Rpb24oKXt2YXIgdD13aW5kb3cualF1ZXJ5O3JldHVybiB0JiYhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoImRhdGEtbm8tanF1ZXJ5Iik/dDpudWxsfSxrPShyPXt9LGE9MSx7c2V0OmZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT10LmtleSYmKHQua2V5PXtrZXk6ZSxpZDphfSxhKyspLHJbdC5rZXkuaWRdPW59LGdldDpmdW5jdGlvbih0LGUpe2lmKCF0fHx2b2lkIDA9PT10LmtleSlyZXR1cm4gbnVsbDt2YXIgbj10LmtleTtyZXR1cm4gbi5rZXk9PT1lP3Jbbi5pZF06bnVsbH0sZGVsZXRlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dC5rZXkpe3ZhciBuPXQua2V5O24ua2V5PT09ZSYmKGRlbGV0ZSByW24uaWRdLGRlbGV0ZSB0LmtleSl9fX0pLFQ9ZnVuY3Rpb24odCxlLG4pe2suc2V0KHQsZSxuKX0sTD1mdW5jdGlvbih0LGUpe3JldHVybiBrLmdldCh0LGUpfSxDPWZ1bmN0aW9uKHQsZSl7ay5kZWxldGUodCxlKX0sQT1FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLFM9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixPPShsPW5ldyBDdXN0b21FdmVudCgiQm9vdHN0cmFwIix7Y2FuY2VsYWJsZTohMH0pLChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5hZGRFdmVudExpc3RlbmVyKCJCb290c3RyYXAiLChmdW5jdGlvbigpe3JldHVybiBudWxsfSkpLGwucHJldmVudERlZmF1bHQoKSxjLmRpc3BhdGNoRXZlbnQobCksbC5kZWZhdWx0UHJldmVudGVkKSxEPS86c2NvcGVcYi87KGZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3QucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlICoiKX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hMH0pKCl8fChBPWZ1bmN0aW9uKHQpe2lmKCFELnRlc3QodCkpcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KTt2YXIgZT1Cb29sZWFuKHRoaXMuaWQpO2V8fCh0aGlzLmlkPXUoInNjb3BlIikpO3ZhciBuPW51bGw7dHJ5e3Q9dC5yZXBsYWNlKEQsIiMiK3RoaXMuaWQpLG49dGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfWZpbmFsbHl7ZXx8dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImlkIil9cmV0dXJuIG59LFM9ZnVuY3Rpb24odCl7aWYoIUQudGVzdCh0KSlyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpO3ZhciBlPUEuY2FsbCh0aGlzLHQpO3JldHVybiB2b2lkIDAhPT1lWzBdP2VbMF06bnVsbH0pO3ZhciBJPUUoKSxOPS9bXi5dKig/PVwuLiopXC58LiovLGo9L1wuLiovLFA9Lzo6XGQrJC8seD17fSxSPTEsSD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LEI9WyJjbGljayIsImRibGNsaWNrIiwibW91c2V1cCIsIm1vdXNlZG93biIsImNvbnRleHRtZW51IiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJtb3VzZW1vdmUiLCJzZWxlY3RzdGFydCIsInNlbGVjdGVuZCIsImtleWRvd24iLCJrZXlwcmVzcyIsImtleXVwIiwib3JpZW50YXRpb25jaGFuZ2UiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcm1vdmUiLCJwb2ludGVydXAiLCJwb2ludGVybGVhdmUiLCJwb2ludGVyY2FuY2VsIiwiZ2VzdHVyZXN0YXJ0IiwiZ2VzdHVyZWNoYW5nZSIsImdlc3R1cmVlbmQiLCJmb2N1cyIsImJsdXIiLCJjaGFuZ2UiLCJyZXNldCIsInNlbGVjdCIsInN1Ym1pdCIsImZvY3VzaW4iLCJmb2N1c291dCIsImxvYWQiLCJ1bmxvYWQiLCJiZWZvcmV1bmxvYWQiLCJyZXNpemUiLCJtb3ZlIiwiRE9NQ29udGVudExvYWRlZCIsInJlYWR5c3RhdGVjaGFuZ2UiLCJlcnJvciIsImFib3J0Iiwic2Nyb2xsIl07ZnVuY3Rpb24gTSh0LGUpe3JldHVybiBlJiZlKyI6OiIrUisrfHx0LnVpZEV2ZW50fHxSKyt9ZnVuY3Rpb24gUSh0KXt2YXIgZT1NKHQpO3JldHVybiB0LnVpZEV2ZW50PWUseFtlXT14W2VdfHx7fSx4W2VdfWZ1bmN0aW9uIFUodCxlLG4pe3ZvaWQgMD09PW4mJihuPW51bGwpO2Zvcih2YXIgaT1PYmplY3Qua2V5cyh0KSxvPTAscz1pLmxlbmd0aDtvPHM7bysrKXt2YXIgcj10W2lbb11dO2lmKHIub3JpZ2luYWxIYW5kbGVyPT09ZSYmci5kZWxlZ2F0aW9uU2VsZWN0b3I9PT1uKXJldHVybiByfXJldHVybiBudWxsfWZ1bmN0aW9uIEYodCxlLG4pe3ZhciBpPSJzdHJpbmciPT10eXBlb2YgZSxvPWk/bjplLHM9dC5yZXBsYWNlKGosIiIpLHI9SFtzXTtyZXR1cm4gciYmKHM9ciksQi5pbmRleE9mKHMpPi0xfHwocz10KSxbaSxvLHNdfWZ1bmN0aW9uIFcodCxlLG4saSxvKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe258fChuPWksaT1udWxsKTt2YXIgcz1GKGUsbixpKSxyPXNbMF0sYT1zWzFdLGw9c1syXSxjPVEodCksdT1jW2xdfHwoY1tsXT17fSksaD1VKHUsYSxyP246bnVsbCk7aWYoaCloLm9uZU9mZj1oLm9uZU9mZiYmbztlbHNle3ZhciBmPU0oYSxlLnJlcGxhY2UoTiwiIikpLGQ9cj9mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uIGkobyl7Zm9yKHZhciBzPXQucXVlcnlTZWxlY3RvckFsbChlKSxyPW8udGFyZ2V0O3ImJnIhPT10aGlzO3I9ci5wYXJlbnROb2RlKWZvcih2YXIgYT1zLmxlbmd0aDthLS07KWlmKHNbYV09PT1yKXJldHVybiBpLm9uZU9mZiYmcS5vZmYodCxvLnR5cGUsbiksbi5hcHBseShyLFtvXSk7cmV0dXJuIG51bGx9fSh0LG4saSk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24gbihpKXtyZXR1cm4gbi5vbmVPZmYmJnEub2ZmKHQsaS50eXBlLGUpLGUuYXBwbHkodCxbaV0pfX0odCxuKTtkLmRlbGVnYXRpb25TZWxlY3Rvcj1yP246bnVsbCxkLm9yaWdpbmFsSGFuZGxlcj1hLGQub25lT2ZmPW8sZC51aWRFdmVudD1mLHVbZl09ZCx0LmFkZEV2ZW50TGlzdGVuZXIobCxkLHIpfX19ZnVuY3Rpb24gVih0LGUsbixpLG8pe3ZhciBzPVUoZVtuXSxpLG8pO3MmJih0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixzLEJvb2xlYW4obykpLGRlbGV0ZSBlW25dW3MudWlkRXZlbnRdKX12YXIgcT17b246ZnVuY3Rpb24odCxlLG4saSl7Vyh0LGUsbixpLCExKX0sb25lOmZ1bmN0aW9uKHQsZSxuLGkpe1codCxlLG4saSwhMCl9LG9mZjpmdW5jdGlvbih0LGUsbixpKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJnQpe3ZhciBvPUYoZSxuLGkpLHM9b1swXSxyPW9bMV0sYT1vWzJdLGw9YSE9PWUsYz1RKHQpLHU9Ii4iPT09ZS5jaGFyQXQoMCk7aWYodm9pZCAwPT09cil7dSYmT2JqZWN0LmtleXMoYykuZm9yRWFjaCgoZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciBvPWVbbl18fHt9O09iamVjdC5rZXlzKG8pLmZvckVhY2goKGZ1bmN0aW9uKHMpe2lmKHMuaW5kZXhPZihpKT4tMSl7dmFyIHI9b1tzXTtWKHQsZSxuLHIub3JpZ2luYWxIYW5kbGVyLHIuZGVsZWdhdGlvblNlbGVjdG9yKX19KSl9KHQsYyxuLGUuc2xpY2UoMSkpfSkpO3ZhciBoPWNbYV18fHt9O09iamVjdC5rZXlzKGgpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW4ucmVwbGFjZShQLCIiKTtpZighbHx8ZS5pbmRleE9mKGkpPi0xKXt2YXIgbz1oW25dO1YodCxjLGEsby5vcmlnaW5hbEhhbmRsZXIsby5kZWxlZ2F0aW9uU2VsZWN0b3IpfX0pKX1lbHNle2lmKCFjfHwhY1thXSlyZXR1cm47Vih0LGMsYSxyLHM/bjpudWxsKX19fSx0cmlnZ2VyOmZ1bmN0aW9uKHQsZSxuKXtpZigic3RyaW5nIiE9dHlwZW9mIGV8fCF0KXJldHVybiBudWxsO3ZhciBpLG89ZS5yZXBsYWNlKGosIiIpLHM9ZSE9PW8scj1CLmluZGV4T2Yobyk+LTEsYT0hMCxsPSEwLGM9ITEsdT1udWxsO3JldHVybiBzJiZJJiYoaT1JLkV2ZW50KGUsbiksSSh0KS50cmlnZ2VyKGkpLGE9IWkuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSxsPSFpLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCksYz1pLmlzRGVmYXVsdFByZXZlbnRlZCgpKSxyPyh1PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJIVE1MRXZlbnRzIikpLmluaXRFdmVudChvLGEsITApOnU9bmV3IEN1c3RvbUV2ZW50KGUse2J1YmJsZXM6YSxjYW5jZWxhYmxlOiEwfSksdm9pZCAwIT09biYmT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUsdCx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5bdF19fSl9KSksYyYmKHUucHJldmVudERlZmF1bHQoKSxPfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodSwiZGVmYXVsdFByZXZlbnRlZCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfX0pKSxsJiZ0LmRpc3BhdGNoRXZlbnQodSksdS5kZWZhdWx0UHJldmVudGVkJiZ2b2lkIDAhPT1pJiZpLnByZXZlbnREZWZhdWx0KCksdX19LHo9ImFsZXJ0IixLPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fZWxlbWVudCYmVCh0LCJicy5hbGVydCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuY2xvc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZWxlbWVudDt0JiYoZT10aGlzLl9nZXRSb290RWxlbWVudCh0KSk7dmFyIG49dGhpcy5fdHJpZ2dlckNsb3NlRXZlbnQoZSk7bnVsbD09PW58fG4uZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5fcmVtb3ZlRWxlbWVudChlKX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5hbGVydCIpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sZS5fZ2V0Um9vdEVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGQodCl8fHQuY2xvc2VzdCgiLmFsZXJ0Iil9LGUuX3RyaWdnZXJDbG9zZUV2ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBxLnRyaWdnZXIodCwiY2xvc2UuYnMuYWxlcnQiKX0sZS5fcmVtb3ZlRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBuPWcodCk7cS5vbmUodCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2Rlc3Ryb3lFbGVtZW50KHQpfSkpLF8odCxuKX1lbHNlIHRoaXMuX2Rlc3Ryb3lFbGVtZW50KHQpfSxlLl9kZXN0cm95RWxlbWVudD1mdW5jdGlvbih0KXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxxLnRyaWdnZXIodCwiY2xvc2VkLmJzLmFsZXJ0Iil9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5hbGVydCIpO258fChuPW5ldyB0KHRoaXMpKSwiY2xvc2UiPT09ZSYmbltlXSh0aGlzKX0pKX0sdC5oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtlJiZlLnByZXZlbnREZWZhdWx0KCksdC5jbG9zZSh0aGlzKX19LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuYWxlcnQiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpIiwnW2RhdGEtZGlzbWlzcz0iYWxlcnQiXScsSy5oYW5kbGVEaXNtaXNzKG5ldyBLKSk7dmFyIFg9RSgpO2lmKFgpe3ZhciBZPVguZm5bel07WC5mblt6XT1LLmpRdWVyeUludGVyZmFjZSxYLmZuW3pdLkNvbnN0cnVjdG9yPUssWC5mblt6XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFguZm5bel09WSxLLmpRdWVyeUludGVyZmFjZX19dmFyICQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuX2VsZW1lbnQ9dCxUKHQsImJzLmJ1dHRvbiIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtcHJlc3NlZCIsdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiKSl9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuYnV0dG9uIiksdGhpcy5fZWxlbWVudD1udWxsfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMuYnV0dG9uIik7bnx8KG49bmV3IHQodGhpcykpLCJ0b2dnbGUiPT09ZSYmbltlXSgpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmJ1dHRvbiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJidXR0b24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKTt2YXIgZT10LnRhcmdldC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9ImJ1dHRvbiJdJyksbj1MKGUsImJzLmJ1dHRvbiIpO258fChuPW5ldyAkKGUpKSxuLnRvZ2dsZSgpfSkpO3ZhciBHPUUoKTtpZihHKXt2YXIgWj1HLmZuLmJ1dHRvbjtHLmZuLmJ1dHRvbj0kLmpRdWVyeUludGVyZmFjZSxHLmZuLmJ1dHRvbi5Db25zdHJ1Y3Rvcj0kLEcuZm4uYnV0dG9uLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRy5mbi5idXR0b249WiwkLmpRdWVyeUludGVyZmFjZX19ZnVuY3Rpb24gSih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiZmFsc2UiIT09dCYmKHQ9PT1OdW1iZXIodCkudG9TdHJpbmcoKT9OdW1iZXIodCk6IiI9PT10fHwibnVsbCI9PT10P251bGw6dCl9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQucmVwbGFjZSgvW0EtWl0vZywoZnVuY3Rpb24odCl7cmV0dXJuIi0iK3QudG9Mb3dlckNhc2UoKX0pKX12YXIgZXQ9e3NldERhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlLG4pe3Quc2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSksbil9LHJlbW92ZURhdGFBdHRyaWJ1dGU6ZnVuY3Rpb24odCxlKXt0LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS0iK3R0KGUpKX0sZ2V0RGF0YUF0dHJpYnV0ZXM6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJue307dmFyIGU9cyh7fSx0LmRhdGFzZXQpO3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPUooZVt0XSl9KSksZX0sZ2V0RGF0YUF0dHJpYnV0ZTpmdW5jdGlvbih0LGUpe3JldHVybiBKKHQuZ2V0QXR0cmlidXRlKCJkYXRhLSIrdHQoZSkpKX0sb2Zmc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3RvcDplLnRvcCtkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCxsZWZ0OmUubGVmdCtkb2N1bWVudC5ib2R5LnNjcm9sbExlZnR9fSxwb3NpdGlvbjpmdW5jdGlvbih0KXtyZXR1cm57dG9wOnQub2Zmc2V0VG9wLGxlZnQ6dC5vZmZzZXRMZWZ0fX0sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCxlKXt0JiYodC5jbGFzc0xpc3QuY29udGFpbnMoZSk/dC5jbGFzc0xpc3QucmVtb3ZlKGUpOnQuY2xhc3NMaXN0LmFkZChlKSl9fSxudD17bWF0Y2hlczpmdW5jdGlvbih0LGUpe3JldHVybiB0Lm1hdGNoZXMoZSl9LGZpbmQ6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSwobj1bXSkuY29uY2F0LmFwcGx5KG4sQS5jYWxsKGUsdCkpfSxmaW5kT25lOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksUy5jYWxsKGUsdCl9LGNoaWxkcmVuOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT0obj1bXSkuY29uY2F0LmFwcGx5KG4sdC5jaGlsZHJlbik7cmV0dXJuIGkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaGVzKGUpfSkpfSxwYXJlbnRzOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPVtdLGk9dC5wYXJlbnROb2RlO2kmJmkubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmMyE9PWkubm9kZVR5cGU7KXRoaXMubWF0Y2hlcyhpLGUpJiZuLnB1c2goaSksaT1pLnBhcmVudE5vZGU7cmV0dXJuIG59LHByZXY6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO247KXtpZihuLm1hdGNoZXMoZSkpcmV0dXJuW25dO249bi5wcmV2aW91c0VsZW1lbnRTaWJsaW5nfXJldHVybltdfSxuZXh0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQubmV4dEVsZW1lbnRTaWJsaW5nO247KXtpZih0aGlzLm1hdGNoZXMobixlKSlyZXR1cm5bbl07bj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm5bXX19LGl0PSJjYXJvdXNlbCIsb3Q9Ii5icy5jYXJvdXNlbCIsc3Q9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITAsdG91Y2g6ITB9LHJ0PXtpbnRlcnZhbDoiKG51bWJlcnxib29sZWFuKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLHNsaWRlOiIoYm9vbGVhbnxzdHJpbmcpIixwYXVzZToiKHN0cmluZ3xib29sZWFuKSIsd3JhcDoiYm9vbGVhbiIsdG91Y2g6ImJvb2xlYW4ifSxhdD17VE9VQ0g6InRvdWNoIixQRU46InBlbiJ9LGx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX2l0ZW1zPW51bGwsdGhpcy5faW50ZXJ2YWw9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faXNQYXVzZWQ9ITEsdGhpcy5faXNTbGlkaW5nPSExLHRoaXMudG91Y2hUaW1lb3V0PW51bGwsdGhpcy50b3VjaFN0YXJ0WD0wLHRoaXMudG91Y2hEZWx0YVg9MCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD1udC5maW5kT25lKCIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsdGhpcy5fZWxlbWVudCksdGhpcy5fdG91Y2hTdXBwb3J0ZWQ9Im9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLHRoaXMuX3BvaW50ZXJFdmVudD1Cb29sZWFuKHdpbmRvdy5Qb2ludGVyRXZlbnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5jYXJvdXNlbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUoIm5leHQiKX0sZS5uZXh0V2hlblZpc2libGU9ZnVuY3Rpb24oKXshZG9jdW1lbnQuaGlkZGVuJiZiKHRoaXMuX2VsZW1lbnQpJiZ0aGlzLm5leHQoKX0sZS5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZSgicHJldiIpfSxlLnBhdXNlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMCksbnQuZmluZE9uZSgiLmNhcm91c2VsLWl0ZW0tbmV4dCwgLmNhcm91c2VsLWl0ZW0tcHJldiIsdGhpcy5fZWxlbWVudCkmJihwKHRoaXMuX2VsZW1lbnQpLHRoaXMuY3ljbGUoITApKSxjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsfSxlLmN5Y2xlPWZ1bmN0aW9uKHQpe3R8fCh0aGlzLl9pc1BhdXNlZD0hMSksdGhpcy5faW50ZXJ2YWwmJihjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKSx0aGlzLl9pbnRlcnZhbD1udWxsKSx0aGlzLl9jb25maWcmJnRoaXMuX2NvbmZpZy5pbnRlcnZhbCYmIXRoaXMuX2lzUGF1c2VkJiYodGhpcy5faW50ZXJ2YWw9c2V0SW50ZXJ2YWwoKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT90aGlzLm5leHRXaGVuVmlzaWJsZTp0aGlzLm5leHQpLmJpbmQodGhpcyksdGhpcy5fY29uZmlnLmludGVydmFsKSl9LGUudG89ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9hY3RpdmVFbGVtZW50PW50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCk7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2FjdGl2ZUVsZW1lbnQpO2lmKCEodD50aGlzLl9pdGVtcy5sZW5ndGgtMXx8dDwwKSlpZih0aGlzLl9pc1NsaWRpbmcpcS5vbmUodGhpcy5fZWxlbWVudCwic2xpZC5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUudG8odCl9KSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPXQ+bj8ibmV4dCI6InByZXYiO3RoaXMuX3NsaWRlKGksdGhpcy5faXRlbXNbdF0pfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7cS5vZmYodGhpcy5fZWxlbWVudCxvdCksQyh0aGlzLl9lbGVtZW50LCJicy5jYXJvdXNlbCIpLHRoaXMuX2l0ZW1zPW51bGwsdGhpcy5fY29uZmlnPW51bGwsdGhpcy5fZWxlbWVudD1udWxsLHRoaXMuX2ludGVydmFsPW51bGwsdGhpcy5faXNQYXVzZWQ9bnVsbCx0aGlzLl9pc1NsaWRpbmc9bnVsbCx0aGlzLl9hY3RpdmVFbGVtZW50PW51bGwsdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxzdCksdCksdihpdCx0LHJ0KSx0fSxlLl9oYW5kbGVTd2lwZT1mdW5jdGlvbigpe3ZhciB0PU1hdGguYWJzKHRoaXMudG91Y2hEZWx0YVgpO2lmKCEodDw9NDApKXt2YXIgZT10L3RoaXMudG91Y2hEZWx0YVg7dGhpcy50b3VjaERlbHRhWD0wLGU+MCYmdGhpcy5wcmV2KCksZTwwJiZ0aGlzLm5leHQoKX19LGUuX2FkZEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb25maWcua2V5Ym9hcmQmJnEub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9rZXlkb3duKGUpfSkpLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlZW50ZXIuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5wYXVzZShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsIm1vdXNlbGVhdmUuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbihlKXtyZXR1cm4gdC5jeWNsZShlKX0pKSksdGhpcy5fY29uZmlnLnRvdWNoJiZ0aGlzLl90b3VjaFN1cHBvcnRlZCYmdGhpcy5fYWRkVG91Y2hFdmVudExpc3RlbmVycygpfSxlLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUpe3QuX3BvaW50ZXJFdmVudCYmYXRbZS5wb2ludGVyVHlwZS50b1VwcGVyQ2FzZSgpXT90LnRvdWNoU3RhcnRYPWUuY2xpZW50WDp0Ll9wb2ludGVyRXZlbnR8fCh0LnRvdWNoU3RhcnRYPWUudG91Y2hlc1swXS5jbGllbnRYKX0sbj1mdW5jdGlvbihlKXt0Ll9wb2ludGVyRXZlbnQmJmF0W2UucG9pbnRlclR5cGUudG9VcHBlckNhc2UoKV0mJih0LnRvdWNoRGVsdGFYPWUuY2xpZW50WC10LnRvdWNoU3RhcnRYKSx0Ll9oYW5kbGVTd2lwZSgpLCJob3ZlciI9PT10Ll9jb25maWcucGF1c2UmJih0LnBhdXNlKCksdC50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dCh0LnRvdWNoVGltZW91dCksdC50b3VjaFRpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY3ljbGUoZSl9KSw1MDArdC5fY29uZmlnLmludGVydmFsKSl9O250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIGltZyIsdGhpcy5fZWxlbWVudCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cS5vbih0LCJkcmFnc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpfSkpfSkpLHRoaXMuX3BvaW50ZXJFdmVudD8ocS5vbih0aGlzLl9lbGVtZW50LCJwb2ludGVyZG93bi5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpLHEub24odGhpcy5fZWxlbWVudCwicG9pbnRlcnVwLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSksdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJwb2ludGVyLWV2ZW50IikpOihxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoc3RhcnQuYnMuY2Fyb3VzZWwiLChmdW5jdGlvbih0KXtyZXR1cm4gZSh0KX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNobW92ZS5icy5jYXJvdXNlbCIsKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtlLnRvdWNoZXMmJmUudG91Y2hlcy5sZW5ndGg+MT90LnRvdWNoRGVsdGFYPTA6dC50b3VjaERlbHRhWD1lLnRvdWNoZXNbMF0uY2xpZW50WC10LnRvdWNoU3RhcnRYfShlKX0pKSxxLm9uKHRoaXMuX2VsZW1lbnQsInRvdWNoZW5kLmJzLmNhcm91c2VsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG4odCl9KSkpfSxlLl9rZXlkb3duPWZ1bmN0aW9uKHQpe2lmKCEvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KHQudGFyZ2V0LnRhZ05hbWUpKXN3aXRjaCh0LmtleSl7Y2FzZSJBcnJvd0xlZnQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLnByZXYoKTticmVhaztjYXNlIkFycm93UmlnaHQiOnQucHJldmVudERlZmF1bHQoKSx0aGlzLm5leHQoKX19LGUuX2dldEl0ZW1JbmRleD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXRlbXM9dCYmdC5wYXJlbnROb2RlP250LmZpbmQoIi5jYXJvdXNlbC1pdGVtIix0LnBhcmVudE5vZGUpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LGUuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPSJuZXh0Ij09PXQsaT0icHJldiI9PT10LG89dGhpcy5fZ2V0SXRlbUluZGV4KGUpLHM9dGhpcy5faXRlbXMubGVuZ3RoLTE7aWYoKGkmJjA9PT1vfHxuJiZvPT09cykmJiF0aGlzLl9jb25maWcud3JhcClyZXR1cm4gZTt2YXIgcj0obysoInByZXYiPT09dD8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cj90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbcl19LGUuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KG50LmZpbmRPbmUoIi5hY3RpdmUuY2Fyb3VzZWwtaXRlbSIsdGhpcy5fZWxlbWVudCkpO3JldHVybiBxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwic2xpZGUuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OnQsZGlyZWN0aW9uOmUsZnJvbTppLHRvOm59KX0sZS5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7Zm9yKHZhciBlPW50LmZpbmQoIi5hY3RpdmUiLHRoaXMuX2luZGljYXRvcnNFbGVtZW50KSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKTt2YXIgaT10aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5jaGlsZHJlblt0aGlzLl9nZXRJdGVtSW5kZXgodCldO2kmJmkuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9fSxlLl9zbGlkZT1mdW5jdGlvbih0LGUpe3ZhciBuLGksbyxzPXRoaXMscj1udC5maW5kT25lKCIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHRoaXMuX2VsZW1lbnQpLGE9dGhpcy5fZ2V0SXRlbUluZGV4KHIpLGw9ZXx8ciYmdGhpcy5fZ2V0SXRlbUJ5RGlyZWN0aW9uKHQsciksYz10aGlzLl9nZXRJdGVtSW5kZXgobCksdT1Cb29sZWFuKHRoaXMuX2ludGVydmFsKTtpZigibmV4dCI9PT10PyhuPSJjYXJvdXNlbC1pdGVtLWxlZnQiLGk9ImNhcm91c2VsLWl0ZW0tbmV4dCIsbz0ibGVmdCIpOihuPSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixpPSJjYXJvdXNlbC1pdGVtLXByZXYiLG89InJpZ2h0IiksbCYmbC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpKXRoaXMuX2lzU2xpZGluZz0hMTtlbHNlIGlmKCF0aGlzLl90cmlnZ2VyU2xpZGVFdmVudChsLG8pLmRlZmF1bHRQcmV2ZW50ZWQmJnImJmwpe2lmKHRoaXMuX2lzU2xpZGluZz0hMCx1JiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2xpZGUiKSl7bC5jbGFzc0xpc3QuYWRkKGkpLHcobCksci5jbGFzc0xpc3QuYWRkKG4pLGwuY2xhc3NMaXN0LmFkZChuKTt2YXIgaD1wYXJzZUludChsLmdldEF0dHJpYnV0ZSgiZGF0YS1pbnRlcnZhbCIpLDEwKTtoPyh0aGlzLl9jb25maWcuZGVmYXVsdEludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbCx0aGlzLl9jb25maWcuaW50ZXJ2YWw9aCk6dGhpcy5fY29uZmlnLmludGVydmFsPXRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWx8fHRoaXMuX2NvbmZpZy5pbnRlcnZhbDt2YXIgZj1nKHIpO3Eub25lKHIsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe2wuY2xhc3NMaXN0LnJlbW92ZShuLGkpLGwuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksci5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiLGksbikscy5faXNTbGlkaW5nPSExLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cS50cmlnZ2VyKHMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KX0pLDApfSkpLF8ocixmKX1lbHNlIHIuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIiksbC5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSx0aGlzLl9pc1NsaWRpbmc9ITEscS50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsInNsaWQuYnMuY2Fyb3VzZWwiLHtyZWxhdGVkVGFyZ2V0OmwsZGlyZWN0aW9uOm8sZnJvbTphLHRvOmN9KTt1JiZ0aGlzLmN5Y2xlKCl9fSx0LmNhcm91c2VsSW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7dmFyIGk9TChlLCJicy5jYXJvdXNlbCIpLG89cyhzKHt9LHN0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSk7Im9iamVjdCI9PXR5cGVvZiBuJiYobz1zKHMoe30sbyksbikpO3ZhciByPSJzdHJpbmciPT10eXBlb2Ygbj9uOm8uc2xpZGU7aWYoaXx8KGk9bmV3IHQoZSxvKSksIm51bWJlciI9PXR5cGVvZiBuKWkudG8obik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHIpe2lmKHZvaWQgMD09PWlbcl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK3IrJyInKTtpW3JdKCl9ZWxzZSBvLmludGVydmFsJiZvLnJpZGUmJihpLnBhdXNlKCksaS5jeWNsZSgpKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0LmNhcm91c2VsSW50ZXJmYWNlKHRoaXMsZSl9KSl9LHQuZGF0YUFwaUNsaWNrSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgbj1kKHRoaXMpO2lmKG4mJm4uY2xhc3NMaXN0LmNvbnRhaW5zKCJjYXJvdXNlbCIpKXt2YXIgaT1zKHMoe30sZXQuZ2V0RGF0YUF0dHJpYnV0ZXMobikpLGV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMpKSxvPXRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLXNsaWRlLXRvIik7byYmKGkuaW50ZXJ2YWw9ITEpLHQuY2Fyb3VzZWxJbnRlcmZhY2UobixpKSxvJiZMKG4sImJzLmNhcm91c2VsIikudG8obyksZS5wcmV2ZW50RGVmYXVsdCgpfX0sdC5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5jYXJvdXNlbCIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gc3R9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLCJbZGF0YS1zbGlkZV0sIFtkYXRhLXNsaWRlLXRvXSIsbHQuZGF0YUFwaUNsaWNrSGFuZGxlcikscS5vbih3aW5kb3csImxvYWQuYnMuY2Fyb3VzZWwuZGF0YS1hcGkiLChmdW5jdGlvbigpe2Zvcih2YXIgdD1udC5maW5kKCdbZGF0YS1yaWRlPSJjYXJvdXNlbCJdJyksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylsdC5jYXJvdXNlbEludGVyZmFjZSh0W2VdLEwodFtlXSwiYnMuY2Fyb3VzZWwiKSl9KSk7dmFyIGN0PUUoKTtpZihjdCl7dmFyIHV0PWN0LmZuW2l0XTtjdC5mbltpdF09bHQualF1ZXJ5SW50ZXJmYWNlLGN0LmZuW2l0XS5Db25zdHJ1Y3Rvcj1sdCxjdC5mbltpdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBjdC5mbltpdF09dXQsbHQualF1ZXJ5SW50ZXJmYWNlfX12YXIgaHQ9ImNvbGxhcHNlIixmdD17dG9nZ2xlOiEwLHBhcmVudDoiIn0sZHQ9e3RvZ2dsZToiYm9vbGVhbiIscGFyZW50OiIoc3RyaW5nfGVsZW1lbnQpIn0sZ3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX3RyaWdnZXJBcnJheT1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrdC5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJyt0LmlkKyciXScpO2Zvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1uW2ldLHI9ZihzKSxhPW50LmZpbmQocikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9KSk7bnVsbCE9PXImJmEubGVuZ3RoJiYodGhpcy5fc2VsZWN0b3I9cix0aGlzLl90cmlnZ2VyQXJyYXkucHVzaChzKSl9dGhpcy5fcGFyZW50PXRoaXMuX2NvbmZpZy5wYXJlbnQ/dGhpcy5fZ2V0UGFyZW50KCk6bnVsbCx0aGlzLl9jb25maWcucGFyZW50fHx0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fZWxlbWVudCx0aGlzLl90cmlnZ2VyQXJyYXkpLHRoaXMuX2NvbmZpZy50b2dnbGUmJnRoaXMudG9nZ2xlKCksVCh0LCJicy5jb2xsYXBzZSIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sZS5zaG93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIG4saTt0aGlzLl9wYXJlbnQmJjA9PT0obj1udC5maW5kKCIuc2hvdywgLmNvbGxhcHNpbmciLHRoaXMuX3BhcmVudCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUuX2NvbmZpZy5wYXJlbnQ/dC5nZXRBdHRyaWJ1dGUoImRhdGEtcGFyZW50Iik9PT1lLl9jb25maWcucGFyZW50OnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJjb2xsYXBzZSIpfSkpKS5sZW5ndGgmJihuPW51bGwpO3ZhciBvPW50LmZpbmRPbmUodGhpcy5fc2VsZWN0b3IpO2lmKG4pe3ZhciBzPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbyE9PXR9KSk7aWYoKGk9c1swXT9MKHNbMF0sImJzLmNvbGxhcHNlIik6bnVsbCkmJmkuX2lzVHJhbnNpdGlvbmluZylyZXR1cm59aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7biYmbi5mb3JFYWNoKChmdW5jdGlvbihlKXtvIT09ZSYmdC5jb2xsYXBzZUludGVyZmFjZShlLCJoaWRlIiksaXx8VChlLCJicy5jb2xsYXBzZSIsbnVsbCl9KSk7dmFyIHI9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZSIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2luZyIpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09MCx0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyQXJyYXkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzZWQiKSx0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApfSkpLHRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dmFyIGE9InNjcm9sbCIrKHJbMF0udG9VcHBlckNhc2UoKStyLnNsaWNlKDEpKSxsPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsKGZ1bmN0aW9uKCl7ZS5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksZS5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIsInNob3ciKSxlLl9lbGVtZW50LnN0eWxlW3JdPSIiLGUuc2V0VHJhbnNpdGlvbmluZyghMSkscS50cmlnZ2VyKGUuX2VsZW1lbnQsInNob3duLmJzLmNvbGxhcHNlIil9KSksXyh0aGlzLl9lbGVtZW50LGwpLHRoaXMuX2VsZW1lbnQuc3R5bGVbcl09dGhpcy5fZWxlbWVudFthXSsicHgifX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLmNvbGxhcHNlIikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2VdKyJweCIsdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImNvbGxhcHNpbmciKSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlIiwic2hvdyIpO3ZhciBuPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYobj4wKWZvcih2YXIgaT0wO2k8bjtpKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtpXSxzPWQobyk7cyYmIXMuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikmJihvLmNsYXNzTGlzdC5hZGQoImNvbGxhcHNlZCIpLG8uc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMSkpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtlXT0iIjt2YXIgcj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLChmdW5jdGlvbigpe3Quc2V0VHJhbnNpdGlvbmluZyghMSksdC5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJjb2xsYXBzaW5nIiksdC5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJjb2xsYXBzZSIpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMuY29sbGFwc2UiKX0pKSxfKHRoaXMuX2VsZW1lbnQscil9fSxlLnNldFRyYW5zaXRpb25pbmc9ZnVuY3Rpb24odCl7dGhpcy5faXNUcmFuc2l0aW9uaW5nPXR9LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMuY29sbGFwc2UiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fdHJpZ2dlckFycmF5PW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGx9LGUuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4odD1zKHMoe30sZnQpLHQpKS50b2dnbGU9Qm9vbGVhbih0LnRvZ2dsZSksdihodCx0LGR0KSx0fSxlLl9nZXREaW1lbnNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoIndpZHRoIik/IndpZHRoIjoiaGVpZ2h0In0sZS5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2NvbmZpZy5wYXJlbnQ7bShlKT92b2lkIDA9PT1lLmpxdWVyeSYmdm9pZCAwPT09ZVswXXx8KGU9ZVswXSk6ZT1udC5maW5kT25lKGUpO3ZhciBuPSdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1bZGF0YS1wYXJlbnQ9IicrZSsnIl0nO3JldHVybiBudC5maW5kKG4sZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZChlKTt0Ll9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MobixbZV0pfSkpLGV9LGUuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcz1mdW5jdGlvbih0LGUpe2lmKHQpe3ZhciBuPXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iik7ZS5sZW5ndGgmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCl7bj90LmNsYXNzTGlzdC5yZW1vdmUoImNvbGxhcHNlZCIpOnQuY2xhc3NMaXN0LmFkZCgiY29sbGFwc2VkIiksdC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLG4pfSkpfX0sdC5jb2xsYXBzZUludGVyZmFjZT1mdW5jdGlvbihlLG4pe3ZhciBpPUwoZSwiYnMuY29sbGFwc2UiKSxvPXMocyhzKHt9LGZ0KSxldC5nZXREYXRhQXR0cmlidXRlcyhlKSksIm9iamVjdCI9PXR5cGVvZiBuJiZuP246e30pO2lmKCFpJiZvLnRvZ2dsZSYmInN0cmluZyI9PXR5cGVvZiBuJiYvc2hvd3xoaWRlLy50ZXN0KG4pJiYoby50b2dnbGU9ITEpLGl8fChpPW5ldyB0KGUsbykpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dC5jb2xsYXBzZUludGVyZmFjZSh0aGlzLGUpfSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmNvbGxhcHNlIil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBmdH19XSksdH0oKTtxLm9uKGRvY3VtZW50LCJjbGljay5icy5jb2xsYXBzZS5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iY29sbGFwc2UiXScsKGZ1bmN0aW9uKHQpeyJBIj09PXQudGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgZT1ldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzKSxuPWYodGhpcyk7bnQuZmluZChuKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgbixpPUwodCwiYnMuY29sbGFwc2UiKTtpPyhudWxsPT09aS5fcGFyZW50JiYic3RyaW5nIj09dHlwZW9mIGUucGFyZW50JiYoaS5fY29uZmlnLnBhcmVudD1lLnBhcmVudCxpLl9wYXJlbnQ9aS5fZ2V0UGFyZW50KCkpLG49InRvZ2dsZSIpOm49ZSxndC5jb2xsYXBzZUludGVyZmFjZSh0LG4pfSkpfSkpO3ZhciBwdD1FKCk7aWYocHQpe3ZhciBtdD1wdC5mbltodF07cHQuZm5baHRdPWd0LmpRdWVyeUludGVyZmFjZSxwdC5mbltodF0uQ29uc3RydWN0b3I9Z3QscHQuZm5baHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gcHQuZm5baHRdPW10LGd0LmpRdWVyeUludGVyZmFjZX19dmFyIF90PSJkcm9wZG93biIsdnQ9bmV3IFJlZ0V4cCgiQXJyb3dVcHxBcnJvd0Rvd258RXNjYXBlIiksYnQ9e29mZnNldDowLGZsaXA6ITAsYm91bmRhcnk6InNjcm9sbFBhcmVudCIscmVmZXJlbmNlOiJ0b2dnbGUiLGRpc3BsYXk6ImR5bmFtaWMiLHBvcHBlckNvbmZpZzpudWxsfSx5dD17b2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGZsaXA6ImJvb2xlYW4iLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixyZWZlcmVuY2U6IihzdHJpbmd8ZWxlbWVudCkiLGRpc3BsYXk6InN0cmluZyIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sd3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsZSl7dGhpcy5fZWxlbWVudD10LHRoaXMuX3BvcHBlcj1udWxsLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fbWVudT10aGlzLl9nZXRNZW51RWxlbWVudCgpLHRoaXMuX2luTmF2YmFyPXRoaXMuX2RldGVjdE5hdmJhcigpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCksVCh0LCJicy5kcm9wZG93biIsdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkudG9nZ2xlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSl7dmFyIHQ9dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtlLmNsZWFyTWVudXMoKSx0fHx0aGlzLnNob3coKX19LGkuc2hvdz1mdW5jdGlvbigpe2lmKCEodGhpcy5fZWxlbWVudC5kaXNhYmxlZHx8dGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIil8fHRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpLGk9e3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH07aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLmRyb3Bkb3duIixpKS5kZWZhdWx0UHJldmVudGVkKXtpZighdGhpcy5faW5OYXZiYXIpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwJ3MgZHJvcGRvd25zIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIG89dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/bz1uOm0odGhpcy5fY29uZmlnLnJlZmVyZW5jZSkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2Usdm9pZCAwIT09dGhpcy5fY29uZmlnLnJlZmVyZW5jZS5qcXVlcnkmJihvPXRoaXMuX2NvbmZpZy5yZWZlcmVuY2VbMF0pKSwic2Nyb2xsUGFyZW50IiE9PXRoaXMuX2NvbmZpZy5ib3VuZGFyeSYmbi5jbGFzc0xpc3QuYWRkKCJwb3NpdGlvbi1zdGF0aWMiKSx0aGlzLl9wb3BwZXI9bmV3IHQobyx0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX12YXIgcztpZigib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmIW4uY2xvc2VzdCgiLm5hdmJhci1uYXYiKSkocz1bXSkuY29uY2F0LmFwcGx5KHMsZG9jdW1lbnQuYm9keS5jaGlsZHJlbikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHEub24odCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTt0aGlzLl9lbGVtZW50LmZvY3VzKCksdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCEwKSxldC50b2dnbGVDbGFzcyh0aGlzLl9tZW51LCJzaG93IiksZXQudG9nZ2xlQ2xhc3ModGhpcy5fZWxlbWVudCwic2hvdyIpLHEudHJpZ2dlcihuLCJzaG93bi5icy5kcm9wZG93biIsaSl9fX0saS5oaWRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2VsZW1lbnQuZGlzYWJsZWQmJiF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSYmdGhpcy5fbWVudS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7dmFyIHQ9ZS5nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KSxuPXtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9O3EudHJpZ2dlcih0LCJoaWRlLmJzLmRyb3Bkb3duIixuKS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuZGVzdHJveSgpLGV0LnRvZ2dsZUNsYXNzKHRoaXMuX21lbnUsInNob3ciKSxldC50b2dnbGVDbGFzcyh0aGlzLl9lbGVtZW50LCJzaG93IikscS50cmlnZ2VyKHQsImhpZGRlbi5icy5kcm9wZG93biIsbikpfX0saS5kaXNwb3NlPWZ1bmN0aW9uKCl7Qyh0aGlzLl9lbGVtZW50LCJicy5kcm9wZG93biIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsIi5icy5kcm9wZG93biIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9tZW51PW51bGwsdGhpcy5fcG9wcGVyJiYodGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCl9LGkudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3Eub24odGhpcy5fZWxlbWVudCwiY2xpY2suYnMuZHJvcGRvd24iLChmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksZS5zdG9wUHJvcGFnYXRpb24oKSx0LnRvZ2dsZSgpfSkpfSxpLl9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9cyhzKHMoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0KSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksdCksdihfdCx0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGkuX2dldE1lbnVFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG50Lm5leHQodGhpcy5fZWxlbWVudCwiLmRyb3Bkb3duLW1lbnUiKVswXX0saS5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLGU9ImJvdHRvbS1zdGFydCI7cmV0dXJuIHQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wdXAiKT8oZT0idG9wLXN0YXJ0Iix0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucygiZHJvcGRvd24tbWVudS1yaWdodCIpJiYoZT0idG9wLWVuZCIpKTp0LmNsYXNzTGlzdC5jb250YWlucygiZHJvcHJpZ2h0Iik/ZT0icmlnaHQtc3RhcnQiOnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wbGVmdCIpP2U9ImxlZnQtc3RhcnQiOnRoaXMuX21lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51LXJpZ2h0IikmJihlPSJib3R0b20tZW5kIiksZX0saS5fZGV0ZWN0TmF2YmFyPWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fZWxlbWVudC5jbG9zZXN0KCIubmF2YmFyIikpfSxpLl9nZXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9e307cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX2NvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuX2NvbmZpZy5vZmZzZXQoZS5vZmZzZXRzLHQuX2VsZW1lbnQpfHx7fSksZX06ZS5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldCxlfSxpLl9nZXRQb3BwZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgdD17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2VuYWJsZWQ6dGhpcy5fY29uZmlnLmZsaXB9LHByZXZlbnRPdmVyZmxvdzp7Ym91bmRhcmllc0VsZW1lbnQ6dGhpcy5fY29uZmlnLmJvdW5kYXJ5fX19O3JldHVybiJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmRpc3BsYXkmJih0Lm1vZGlmaWVycy5hcHBseVN0eWxlPXtlbmFibGVkOiExfSkscyhzKHt9LHQpLHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcpfSxlLmRyb3Bkb3duSW50ZXJmYWNlPWZ1bmN0aW9uKHQsbil7dmFyIGk9TCh0LCJicy5kcm9wZG93biIpO2lmKGl8fChpPW5ldyBlKHQsIm9iamVjdCI9PXR5cGVvZiBuP246bnVsbCkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYodm9pZCAwPT09aVtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO2lbbl0oKX19LGUualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7ZS5kcm9wZG93bkludGVyZmFjZSh0aGlzLHQpfSkpfSxlLmNsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDIhPT10LmJ1dHRvbiYmKCJrZXl1cCIhPT10LnR5cGV8fCJUYWIiPT09dC5rZXkpKWZvcih2YXIgbj1udC5maW5kKCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgcz1lLmdldFBhcmVudEZyb21FbGVtZW50KG5baV0pLHI9TChuW2ldLCJicy5kcm9wZG93biIpLGE9e3JlbGF0ZWRUYXJnZXQ6bltpXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKGEuY2xpY2tFdmVudD10KSxyKXt2YXIgbD1yLl9tZW51O2lmKG5baV0uY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93IikpaWYoISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmIlRhYiI9PT10LmtleSkmJmwuY29udGFpbnModC50YXJnZXQpKSlpZighcS50cmlnZ2VyKHMsImhpZGUuYnMuZHJvcGRvd24iLGEpLmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciBjO2lmKCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KShjPVtdKS5jb25jYXQuYXBwbHkoYyxkb2N1bWVudC5ib2R5LmNoaWxkcmVuKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gcS5vZmYodCwibW91c2VvdmVyIixudWxsLChmdW5jdGlvbigpe30pKX0pKTtuW2ldLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsImZhbHNlIiksci5fcG9wcGVyJiZyLl9wb3BwZXIuZGVzdHJveSgpLGwuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLG5baV0uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEudHJpZ2dlcihzLCJoaWRkZW4uYnMuZHJvcGRvd24iLGEpfX19fSxlLmdldFBhcmVudEZyb21FbGVtZW50PWZ1bmN0aW9uKHQpe3JldHVybiBkKHQpfHx0LnBhcmVudE5vZGV9LGUuZGF0YUFwaUtleWRvd25IYW5kbGVyPWZ1bmN0aW9uKHQpe2lmKCEoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8iU3BhY2UiPT09dC5rZXl8fCJFc2NhcGUiIT09dC5rZXkmJigiQXJyb3dEb3duIiE9PXQua2V5JiYiQXJyb3dVcCIhPT10LmtleXx8dC50YXJnZXQuY2xvc2VzdCgiLmRyb3Bkb3duLW1lbnUiKSk6IXZ0LnRlc3QodC5rZXkpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoImRpc2FibGVkIikpKXt2YXIgbj1lLmdldFBhcmVudEZyb21FbGVtZW50KHRoaXMpLGk9dGhpcy5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKTtpZigiRXNjYXBlIj09PXQua2V5KXJldHVybih0aGlzLm1hdGNoZXMoJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScpP3RoaXM6bnQucHJldih0aGlzLCdbZGF0YS10b2dnbGU9ImRyb3Bkb3duIl0nKVswXSkuZm9jdXMoKSx2b2lkIGUuY2xlYXJNZW51cygpO2lmKGkmJiJTcGFjZSIhPT10LmtleSl7dmFyIG89bnQuZmluZCgiLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCkiLG4pLmZpbHRlcihiKTtpZihvLmxlbmd0aCl7dmFyIHM9by5pbmRleE9mKHQudGFyZ2V0KTsiQXJyb3dVcCI9PT10LmtleSYmcz4wJiZzLS0sIkFycm93RG93biI9PT10LmtleSYmczxvLmxlbmd0aC0xJiZzKyssb1tzPS0xPT09cz8wOnNdLmZvY3VzKCl9fWVsc2UgZS5jbGVhck1lbnVzKCl9fSxlLmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLmRyb3Bkb3duIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBidH19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4geXR9fV0pLGV9KCk7cS5vbihkb2N1bWVudCwia2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsd3QuZGF0YUFwaUtleWRvd25IYW5kbGVyKSxxLm9uKGRvY3VtZW50LCJrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duLW1lbnUiLHd0LmRhdGFBcGlLZXlkb3duSGFuZGxlcikscS5vbihkb2N1bWVudCwiY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGkiLHd0LmNsZWFyTWVudXMpLHEub24oZG9jdW1lbnQsImtleXVwLmJzLmRyb3Bkb3duLmRhdGEtYXBpIix3dC5jbGVhck1lbnVzKSxxLm9uKGRvY3VtZW50LCJjbGljay5icy5kcm9wZG93bi5kYXRhLWFwaSIsJ1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsKGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLHd0LmRyb3Bkb3duSW50ZXJmYWNlKHRoaXMsInRvZ2dsZSIpfSkpLHEub24oZG9jdW1lbnQsImNsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpIiwiLmRyb3Bkb3duIGZvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oKX0pKTt2YXIgRXQ9RSgpO2lmKEV0KXt2YXIga3Q9RXQuZm5bX3RdO0V0LmZuW190XT13dC5qUXVlcnlJbnRlcmZhY2UsRXQuZm5bX3RdLkNvbnN0cnVjdG9yPXd0LEV0LmZuW190XS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIEV0LmZuW190XT1rdCx3dC5qUXVlcnlJbnRlcmZhY2V9fXZhciBUdD17YmFja2Ryb3A6ITAsa2V5Ym9hcmQ6ITAsZm9jdXM6ITAsc2hvdzohMH0sTHQ9e2JhY2tkcm9wOiIoYm9vbGVhbnxzdHJpbmcpIixrZXlib2FyZDoiYm9vbGVhbiIsZm9jdXM6ImJvb2xlYW4iLHNob3c6ImJvb2xlYW4ifSxDdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9dCx0aGlzLl9kaWFsb2c9bnQuZmluZE9uZSgiLm1vZGFsLWRpYWxvZyIsdCksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5faXNUcmFuc2l0aW9uaW5nPSExLHRoaXMuX3Njcm9sbGJhcldpZHRoPTAsVCh0LCJicy5tb2RhbCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUudG9nZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pc1Nob3duP3RoaXMuaGlkZSgpOnRoaXMuc2hvdyh0KX0sZS5zaG93PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoIXRoaXMuX2lzU2hvd24mJiF0aGlzLl9pc1RyYW5zaXRpb25pbmcpe3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApO3ZhciBuPXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLm1vZGFsIix7cmVsYXRlZFRhcmdldDp0fSk7dGhpcy5faXNTaG93bnx8bi5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5faXNTaG93bj0hMCx0aGlzLl9jaGVja1Njcm9sbGJhcigpLHRoaXMuX3NldFNjcm9sbGJhcigpLHRoaXMuX2FkanVzdERpYWxvZygpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLCdbZGF0YS1kaXNtaXNzPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7cmV0dXJuIGUuaGlkZSh0KX0pKSxxLm9uKHRoaXMuX2RpYWxvZywibW91c2Vkb3duLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbigpe3Eub25lKGUuX2VsZW1lbnQsIm1vdXNldXAuZGlzbWlzcy5icy5tb2RhbCIsKGZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZS5fZWxlbWVudCYmKGUuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITApfSkpfSkpLHRoaXMuX3Nob3dCYWNrZHJvcCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc2hvd0VsZW1lbnQodCl9KSkpfX0sZS5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYoKHQmJnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9pc1Nob3duJiYhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLm1vZGFsIikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5faXNTaG93bj0hMTt2YXIgbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpO2lmKG4mJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub2ZmKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiKSxxLm9mZih0aGlzLl9kaWFsb2csIm1vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsIiksbil7dmFyIGk9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2hpZGVNb2RhbCh0KX0pKSxfKHRoaXMuX2VsZW1lbnQsaSl9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe1t3aW5kb3csdGhpcy5fZWxlbWVudCx0aGlzLl9kaWFsb2ddLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCIuYnMubW9kYWwiKX0pKSxxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLEModGhpcy5fZWxlbWVudCwiYnMubW9kYWwiKSx0aGlzLl9jb25maWc9bnVsbCx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fZGlhbG9nPW51bGwsdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPW51bGwsdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmc9bnVsbCx0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrPW51bGwsdGhpcy5faXNUcmFuc2l0aW9uaW5nPW51bGwsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9bnVsbH0sZS5oYW5kbGVVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3REaWFsb2coKX0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyh7fSxUdCksdCksdigibW9kYWwiLHQsTHQpLHR9LGUuX3Nob3dFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpLGk9bnQuZmluZE9uZSgiLm1vZGFsLWJvZHkiLHRoaXMuX2RpYWxvZyk7dGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERXx8ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1tb2RhbCIsITApLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJyb2xlIiwiZGlhbG9nIiksdGhpcy5fZWxlbWVudC5zY3JvbGxUb3A9MCxpJiYoaS5zY3JvbGxUb3A9MCksbiYmdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBvPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLHEudHJpZ2dlcihlLl9lbGVtZW50LCJzaG93bi5icy5tb2RhbCIse3JlbGF0ZWRUYXJnZXQ6dH0pfTtpZihuKXt2YXIgcz1nKHRoaXMuX2RpYWxvZyk7cS5vbmUodGhpcy5fZGlhbG9nLCJ0cmFuc2l0aW9uZW5kIixvKSxfKHRoaXMuX2RpYWxvZyxzKX1lbHNlIG8oKX0sZS5fZW5mb3JjZUZvY3VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztxLm9mZihkb2N1bWVudCwiZm9jdXNpbi5icy5tb2RhbCIpLHEub24oZG9jdW1lbnQsImZvY3VzaW4uYnMubW9kYWwiLChmdW5jdGlvbihlKXtkb2N1bWVudD09PWUudGFyZ2V0fHx0Ll9lbGVtZW50PT09ZS50YXJnZXR8fHQuX2VsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpfHx0Ll9lbGVtZW50LmZvY3VzKCl9KSl9LGUuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9pc1Nob3duP3Eub24odGhpcy5fZWxlbWVudCwia2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsIiwoZnVuY3Rpb24oZSl7dC5fY29uZmlnLmtleWJvYXJkJiYiRXNjYXBlIj09PWUua2V5PyhlLnByZXZlbnREZWZhdWx0KCksdC5oaWRlKCkpOnQuX2NvbmZpZy5rZXlib2FyZHx8IkVzY2FwZSIhPT1lLmtleXx8dC5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpfSkpOnEub2ZmKHRoaXMuX2VsZW1lbnQsImtleWRvd24uZGlzbWlzcy5icy5tb2RhbCIpfSxlLl9zZXRSZXNpemVFdmVudD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5faXNTaG93bj9xLm9uKHdpbmRvdywicmVzaXplLmJzLm1vZGFsIiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0RGlhbG9nKCl9KSk6cS5vZmYod2luZG93LCJyZXNpemUuYnMubW9kYWwiKX0sZS5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLW1vZGFsIiksdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoInJvbGUiKSx0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fc2hvd0JhY2tkcm9wKChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgibW9kYWwtb3BlbiIpLHQuX3Jlc2V0QWRqdXN0bWVudHMoKSx0Ll9yZXNldFNjcm9sbGJhcigpLHEudHJpZ2dlcih0Ll9lbGVtZW50LCJoaWRkZW4uYnMubW9kYWwiKX0pKX0sZS5fcmVtb3ZlQmFja2Ryb3A9ZnVuY3Rpb24oKXt0aGlzLl9iYWNrZHJvcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcD1udWxsfSxlLl9zaG93QmFja2Ryb3A9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIik/ImZhZGUiOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPSJtb2RhbC1iYWNrZHJvcCIsbiYmdGhpcy5fYmFja2Ryb3AuY2xhc3NMaXN0LmFkZChuKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2JhY2tkcm9wKSxxLm9uKHRoaXMuX2VsZW1lbnQsImNsaWNrLmRpc21pc3MuYnMubW9kYWwiLChmdW5jdGlvbih0KXtlLl9pZ25vcmVCYWNrZHJvcENsaWNrP2UuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITE6dC50YXJnZXQ9PT10LmN1cnJlbnRUYXJnZXQmJmUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb24oKX0pKSxuJiZ3KHRoaXMuX2JhY2tkcm9wKSx0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QuYWRkKCJzaG93IiksIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPWcodGhpcy5fYmFja2Ryb3ApO3Eub25lKHRoaXMuX2JhY2tkcm9wLCJ0cmFuc2l0aW9uZW5kIix0KSxfKHRoaXMuX2JhY2tkcm9wLGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXt0aGlzLl9iYWNrZHJvcC5jbGFzc0xpc3QucmVtb3ZlKCJzaG93Iik7dmFyIG89ZnVuY3Rpb24oKXtlLl9yZW1vdmVCYWNrZHJvcCgpLHQoKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSl7dmFyIHM9Zyh0aGlzLl9iYWNrZHJvcCk7cS5vbmUodGhpcy5fYmFja2Ryb3AsInRyYW5zaXRpb25lbmQiLG8pLF8odGhpcy5fYmFja2Ryb3Ascyl9ZWxzZSBvKCl9ZWxzZSB0KCl9LGUuX3RyaWdnZXJCYWNrZHJvcFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCJzdGF0aWMiPT09dGhpcy5fY29uZmlnLmJhY2tkcm9wKXtpZihxLnRyaWdnZXIodGhpcy5fZWxlbWVudCwiaGlkZVByZXZlbnRlZC5icy5tb2RhbCIpLmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO3RoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgibW9kYWwtc3RhdGljIik7dmFyIGU9Zyh0aGlzLl9lbGVtZW50KTtxLm9uZSh0aGlzLl9lbGVtZW50LCJ0cmFuc2l0aW9uZW5kIiwoZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoIm1vZGFsLXN0YXRpYyIpfSkpLF8odGhpcy5fZWxlbWVudCxlKSx0aGlzLl9lbGVtZW50LmZvY3VzKCl9ZWxzZSB0aGlzLmhpZGUoKX0sZS5fYWRqdXN0RGlhbG9nPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDshdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcmJnQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiYhdCYmKHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0PXRoaXMuX3Njcm9sbGJhcldpZHRoKyJweCIpfSxlLl9yZXNldEFkanVzdG1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD0iIix0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD0iIn0sZS5fY2hlY2tTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3RoaXMuX2lzQm9keU92ZXJmbG93aW5nPU1hdGgucm91bmQodC5sZWZ0K3QucmlnaHQpPHdpbmRvdy5pbm5lcldpZHRoLHRoaXMuX3Njcm9sbGJhcldpZHRoPXRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCl9LGUuX3NldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpe250LmZpbmQoIi5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShlLCJwYWRkaW5nLXJpZ2h0IixuKSxlLnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KGkpK3QuX3Njcm9sbGJhcldpZHRoKyJweCJ9KSksbnQuZmluZCgiLnN0aWNreS10b3AiKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSlbIm1hcmdpbi1yaWdodCJdO2V0LnNldERhdGFBdHRyaWJ1dGUoZSwibWFyZ2luLXJpZ2h0IixuKSxlLnN0eWxlLm1hcmdpblJpZ2h0PXBhcnNlRmxvYXQoaSktdC5fc2Nyb2xsYmFyV2lkdGgrInB4In0pKTt2YXIgZT1kb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCxuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpWyJwYWRkaW5nLXJpZ2h0Il07ZXQuc2V0RGF0YUF0dHJpYnV0ZShkb2N1bWVudC5ib2R5LCJwYWRkaW5nLXJpZ2h0IixlKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1wYXJzZUZsb2F0KG4pK3RoaXMuX3Njcm9sbGJhcldpZHRoKyJweCJ9ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJtb2RhbC1vcGVuIil9LGUuX3Jlc2V0U2Nyb2xsYmFyPWZ1bmN0aW9uKCl7bnQuZmluZCgiLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwicGFkZGluZy1yaWdodCIpO3ZvaWQgMCE9PWUmJihldC5yZW1vdmVEYXRhQXR0cmlidXRlKHQsInBhZGRpbmctcmlnaHQiKSx0LnN0eWxlLnBhZGRpbmdSaWdodD1lKX0pKSxudC5maW5kKCIuc3RpY2t5LXRvcCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0Iik7dm9pZCAwIT09ZSYmKGV0LnJlbW92ZURhdGFBdHRyaWJ1dGUodCwibWFyZ2luLXJpZ2h0IiksdC5zdHlsZS5tYXJnaW5SaWdodD1lKX0pKTt2YXIgdD1ldC5nZXREYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKTt2b2lkIDA9PT10P2RvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0PSIiOihldC5yZW1vdmVEYXRhQXR0cmlidXRlKGRvY3VtZW50LmJvZHksInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD10KX0sZS5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT0ibW9kYWwtc2Nyb2xsYmFyLW1lYXN1cmUiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC10LmNsaWVudFdpZHRoO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGV9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgaT1MKHRoaXMsImJzLm1vZGFsIiksbz1zKHMocyh7fSxUdCksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpLCJvYmplY3QiPT10eXBlb2YgZSYmZT9lOnt9KTtpZihpfHwoaT1uZXcgdCh0aGlzLG8pKSwic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PWlbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtpW2VdKG4pfWVsc2Ugby5zaG93JiZpLnNob3cobil9KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMubW9kYWwiKX0sbih0LG51bGwsW3trZXk6IlZFUlNJT04iLGdldDpmdW5jdGlvbigpe3JldHVybiI1LjAuMC1hbHBoYTEifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFR0fX1dKSx0fSgpO3Eub24oZG9jdW1lbnQsImNsaWNrLmJzLm1vZGFsLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJywoZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWQodGhpcyk7IkEiIT09dGhpcy50YWdOYW1lJiYiQVJFQSIhPT10aGlzLnRhZ05hbWV8fHQucHJldmVudERlZmF1bHQoKSxxLm9uZShuLCJzaG93LmJzLm1vZGFsIiwoZnVuY3Rpb24odCl7dC5kZWZhdWx0UHJldmVudGVkfHxxLm9uZShuLCJoaWRkZW4uYnMubW9kYWwiLChmdW5jdGlvbigpe2IoZSkmJmUuZm9jdXMoKX0pKX0pKTt2YXIgaT1MKG4sImJzLm1vZGFsIik7aWYoIWkpe3ZhciBvPXMocyh7fSxldC5nZXREYXRhQXR0cmlidXRlcyhuKSksZXQuZ2V0RGF0YUF0dHJpYnV0ZXModGhpcykpO2k9bmV3IEN0KG4sbyl9aS5zaG93KHRoaXMpfSkpO3ZhciBBdD1FKCk7aWYoQXQpe3ZhciBTdD1BdC5mbi5tb2RhbDtBdC5mbi5tb2RhbD1DdC5qUXVlcnlJbnRlcmZhY2UsQXQuZm4ubW9kYWwuQ29uc3RydWN0b3I9Q3QsQXQuZm4ubW9kYWwubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBBdC5mbi5tb2RhbD1TdCxDdC5qUXVlcnlJbnRlcmZhY2V9fXZhciBPdD1bImJhY2tncm91bmQiLCJjaXRlIiwiaHJlZiIsIml0ZW10eXBlIiwibG9uZ2Rlc2MiLCJwb3N0ZXIiLCJzcmMiLCJ4bGluazpocmVmIl0sRHQ9L14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZSk6fFteIyYvOj9dKig/OlsjLz9dfCQpKS9naSxJdD0vXmRhdGE6KD86aW1hZ2VcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cLyg/Om1wZWd8bXA0fG9nZ3x3ZWJtKXxhdWRpb1wvKD86bXAzfG9nYXxvZ2d8b3B1cykpO2Jhc2U2NCxbXGQrL2Etel0rPSokL2ksTnQ9eyIqIjpbImNsYXNzIiwiZGlyIiwiaWQiLCJsYW5nIiwicm9sZSIsL15hcmlhLVtcdy1dKiQvaV0sYTpbInRhcmdldCIsImhyZWYiLCJ0aXRsZSIsInJlbCJdLGFyZWE6W10sYjpbXSxicjpbXSxjb2w6W10sY29kZTpbXSxkaXY6W10sZW06W10saHI6W10saDE6W10saDI6W10saDM6W10saDQ6W10saDU6W10saDY6W10saTpbXSxpbWc6WyJzcmMiLCJzcmNzZXQiLCJhbHQiLCJ0aXRsZSIsIndpZHRoIiwiaGVpZ2h0Il0sbGk6W10sb2w6W10scDpbXSxwcmU6W10sczpbXSxzbWFsbDpbXSxzcGFuOltdLHN1YjpbXSxzdXA6W10sc3Ryb25nOltdLHU6W10sdWw6W119O2Z1bmN0aW9uIGp0KHQsZSxuKXt2YXIgaTtpZighdC5sZW5ndGgpcmV0dXJuIHQ7aWYobiYmImZ1bmN0aW9uIj09dHlwZW9mIG4pcmV0dXJuIG4odCk7Zm9yKHZhciBvPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsInRleHQvaHRtbCIpLHM9T2JqZWN0LmtleXMoZSkscj0oaT1bXSkuY29uY2F0LmFwcGx5KGksby5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSksYT1mdW5jdGlvbih0LG4pe3ZhciBpLG89clt0XSxhPW8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigtMT09PXMuaW5kZXhPZihhKSlyZXR1cm4gby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCJjb250aW51ZSI7dmFyIGw9KGk9W10pLmNvbmNhdC5hcHBseShpLG8uYXR0cmlidXRlcyksYz1bXS5jb25jYXQoZVsiKiJdfHxbXSxlW2FdfHxbXSk7bC5mb3JFYWNoKChmdW5jdGlvbih0KXsoZnVuY3Rpb24odCxlKXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoLTEhPT1lLmluZGV4T2YobikpcmV0dXJuLTE9PT1PdC5pbmRleE9mKG4pfHxCb29sZWFuKHQubm9kZVZhbHVlLm1hdGNoKER0KXx8dC5ub2RlVmFsdWUubWF0Y2goSXQpKTtmb3IodmFyIGk9ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfSkpLG89MCxzPWkubGVuZ3RoO288cztvKyspaWYobi5tYXRjaChpW29dKSlyZXR1cm4hMDtyZXR1cm4hMX0pKHQsYyl8fG8ucmVtb3ZlQXR0cmlidXRlKHQubm9kZU5hbWUpfSkpfSxsPTAsYz1yLmxlbmd0aDtsPGM7bCsrKWEobCk7cmV0dXJuIG8uYm9keS5pbm5lckhUTUx9dmFyIFB0PSJ0b29sdGlwIix4dD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtdG9vbHRpcFxcUysiLCJnIiksUnQ9WyJzYW5pdGl6ZSIsIndoaXRlTGlzdCIsInNhbml0aXplRm4iXSxIdD17YW5pbWF0aW9uOiJib29sZWFuIix0ZW1wbGF0ZToic3RyaW5nIix0aXRsZToiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSIsdHJpZ2dlcjoic3RyaW5nIixkZWxheToiKG51bWJlcnxvYmplY3QpIixodG1sOiJib29sZWFuIixzZWxlY3RvcjoiKHN0cmluZ3xib29sZWFuKSIscGxhY2VtZW50OiIoc3RyaW5nfGZ1bmN0aW9uKSIsb2Zmc2V0OiIobnVtYmVyfHN0cmluZ3xmdW5jdGlvbikiLGNvbnRhaW5lcjoiKHN0cmluZ3xlbGVtZW50fGJvb2xlYW4pIixmYWxsYmFja1BsYWNlbWVudDoiKHN0cmluZ3xhcnJheSkiLGJvdW5kYXJ5OiIoc3RyaW5nfGVsZW1lbnQpIixzYW5pdGl6ZToiYm9vbGVhbiIsc2FuaXRpemVGbjoiKG51bGx8ZnVuY3Rpb24pIix3aGl0ZUxpc3Q6Im9iamVjdCIscG9wcGVyQ29uZmlnOiIobnVsbHxvYmplY3QpIn0sQnQ9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0sTXQ9e2FuaW1hdGlvbjohMCx0ZW1wbGF0ZTonPGRpdiBjbGFzcz0idG9vbHRpcCIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0idG9vbHRpcC1hcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiExLHNlbGVjdG9yOiExLHBsYWNlbWVudDoidG9wIixvZmZzZXQ6MCxjb250YWluZXI6ITEsZmFsbGJhY2tQbGFjZW1lbnQ6ImZsaXAiLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHNhbml0aXplOiEwLHNhbml0aXplRm46bnVsbCx3aGl0ZUxpc3Q6TnQscG9wcGVyQ29uZmlnOm51bGx9LFF0PXtISURFOiJoaWRlLmJzLnRvb2x0aXAiLEhJRERFTjoiaGlkZGVuLmJzLnRvb2x0aXAiLFNIT1c6InNob3cuYnMudG9vbHRpcCIsU0hPV046InNob3duLmJzLnRvb2x0aXAiLElOU0VSVEVEOiJpbnNlcnRlZC5icy50b29sdGlwIixDTElDSzoiY2xpY2suYnMudG9vbHRpcCIsRk9DVVNJTjoiZm9jdXNpbi5icy50b29sdGlwIixGT0NVU09VVDoiZm9jdXNvdXQuYnMudG9vbHRpcCIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy50b29sdGlwIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnRvb2x0aXAifSxVdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxuKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkJvb3RzdHJhcCdzIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PWUsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKG4pLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVChlLHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksdGhpcyl9dmFyIGk9ZS5wcm90b3R5cGU7cmV0dXJuIGkuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSxpLmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LGkudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSxpLnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPUwodC50YXJnZXQsZSk7bnx8KG49bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxlLG4pKSxuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrPSFuLl9hY3RpdmVUcmlnZ2VyLmNsaWNrLG4uX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKT9uLl9lbnRlcihudWxsLG4pOm4uX2xlYXZlKG51bGwsbil9ZWxzZXtpZih0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSlyZXR1cm4gdm9pZCB0aGlzLl9sZWF2ZShudWxsLHRoaXMpO3RoaXMuX2VudGVyKG51bGwsdGhpcyl9fSxpLmRpc3Bvc2U9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksQyh0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSkscS5vZmYodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxxLm9mZih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMudGlwJiZ0aGlzLnRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudGlwKSx0aGlzLl9pc0VuYWJsZWQ9bnVsbCx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5faG92ZXJTdGF0ZT1udWxsLHRoaXMuX2FjdGl2ZVRyaWdnZXI9bnVsbCx0aGlzLl9wb3BwZXImJnRoaXMuX3BvcHBlci5kZXN0cm95KCksdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PW51bGwsdGhpcy5jb25maWc9bnVsbCx0aGlzLnRpcD1udWxsfSxpLnNob3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCJub25lIj09PXRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5KXRocm93IG5ldyBFcnJvcigiUGxlYXNlIHVzZSBzaG93IG9uIHZpc2libGUgZWxlbWVudHMiKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXt2YXIgbj1xLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyksaT1mdW5jdGlvbiB0KGUpe2lmKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KXJldHVybiBudWxsO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJvb3ROb2RlKXt2YXIgbj1lLmdldFJvb3ROb2RlKCk7cmV0dXJuIG4gaW5zdGFuY2VvZiBTaGFkb3dSb290P246bnVsbH1yZXR1cm4gZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/ZTplLnBhcmVudE5vZGU/dChlLnBhcmVudE5vZGUpOm51bGx9KHRoaXMuZWxlbWVudCksbz1udWxsPT09aT90aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy5lbGVtZW50KTppLmNvbnRhaW5zKHRoaXMuZWxlbWVudCk7aWYobi5kZWZhdWx0UHJldmVudGVkfHwhbylyZXR1cm47dmFyIHM9dGhpcy5nZXRUaXBFbGVtZW50KCkscj11KHRoaXMuY29uc3RydWN0b3IuTkFNRSk7cy5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnMuY2xhc3NMaXN0LmFkZCgiZmFkZSIpO3ZhciBhPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5wbGFjZW1lbnQ/dGhpcy5jb25maWcucGxhY2VtZW50LmNhbGwodGhpcyxzLHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcucGxhY2VtZW50LGw9dGhpcy5fZ2V0QXR0YWNobWVudChhKTt0aGlzLl9hZGRBdHRhY2htZW50Q2xhc3MobCk7dmFyIGMsaD10aGlzLl9nZXRDb250YWluZXIoKTtpZihUKHMsdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSx0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnModGhpcy50aXApfHxoLmFwcGVuZENoaWxkKHMpLHEudHJpZ2dlcih0aGlzLmVsZW1lbnQsdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyB0KHRoaXMuZWxlbWVudCxzLHRoaXMuX2dldFBvcHBlckNvbmZpZyhsKSkscy5jbGFzc0xpc3QuYWRkKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGM9W10pLmNvbmNhdC5hcHBseShjLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Eub24odCwibW91c2VvdmVyIiwoZnVuY3Rpb24oKXt9KSl9KSk7dmFyIGY9ZnVuY3Rpb24oKXtlLmNvbmZpZy5hbmltYXRpb24mJmUuX2ZpeFRyYW5zaXRpb24oKTt2YXIgdD1lLl9ob3ZlclN0YXRlO2UuX2hvdmVyU3RhdGU9bnVsbCxxLnRyaWdnZXIoZS5lbGVtZW50LGUuY29uc3RydWN0b3IuRXZlbnQuU0hPV04pLCJvdXQiPT09dCYmZS5fbGVhdmUobnVsbCxlKX07aWYodGhpcy50aXAuY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikpe3ZhciBkPWcodGhpcy50aXApO3Eub25lKHRoaXMudGlwLCJ0cmFuc2l0aW9uZW5kIixmKSxfKHRoaXMudGlwLGQpfWVsc2UgZigpfX0saS5oaWRlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuZ2V0VGlwRWxlbWVudCgpLG49ZnVuY3Rpb24oKXsic2hvdyIhPT10Ll9ob3ZlclN0YXRlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSx0Ll9jbGVhblRpcENsYXNzKCksdC5lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIpLHEudHJpZ2dlcih0LmVsZW1lbnQsdC5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLHQuX3BvcHBlci5kZXN0cm95KCl9O2lmKCFxLnRyaWdnZXIodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGk7aWYoZS5jbGFzc0xpc3QucmVtb3ZlKCJzaG93IiksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKGk9W10pLmNvbmNhdC5hcHBseShpLGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBxLm9mZih0LCJtb3VzZW92ZXIiLHkpfSkpO2lmKHRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2s9ITEsdGhpcy5fYWN0aXZlVHJpZ2dlci5mb2N1cz0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyLmhvdmVyPSExLHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucygiZmFkZSIpKXt2YXIgbz1nKGUpO3Eub25lKGUsInRyYW5zaXRpb25lbmQiLG4pLF8oZSxvKX1lbHNlIG4oKTt0aGlzLl9ob3ZlclN0YXRlPSIifX0saS51cGRhdGU9ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0saS5pc1dpdGhDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKX0saS5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7aWYodGhpcy50aXApcmV0dXJuIHRoaXMudGlwO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmlubmVySFRNTD10aGlzLmNvbmZpZy50ZW1wbGF0ZSx0aGlzLnRpcD10LmNoaWxkcmVuWzBdLHRoaXMudGlwfSxpLnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KG50LmZpbmRPbmUoIi50b29sdGlwLWlubmVyIix0KSx0aGlzLmdldFRpdGxlKCkpLHQuY2xhc3NMaXN0LnJlbW92ZSgiZmFkZSIsInNob3ciKX0saS5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe2lmKG51bGwhPT10KXJldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbShlKT8oZS5qcXVlcnkmJihlPWVbMF0pLHZvaWQodGhpcy5jb25maWcuaHRtbD9lLnBhcmVudE5vZGUhPT10JiYodC5pbm5lckhUTUw9IiIsdC5hcHBlbmRDaGlsZChlKSk6dC50ZXh0Q29udGVudD1lLnRleHRDb250ZW50KSk6dm9pZCh0aGlzLmNvbmZpZy5odG1sPyh0aGlzLmNvbmZpZy5zYW5pdGl6ZSYmKGU9anQoZSx0aGlzLmNvbmZpZy53aGl0ZUxpc3QsdGhpcy5jb25maWcuc2FuaXRpemVGbikpLHQuaW5uZXJIVE1MPWUpOnQudGV4dENvbnRlbnQ9ZSl9LGkuZ2V0VGl0bGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7cmV0dXJuIHR8fCh0PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy50aXRsZT90aGlzLmNvbmZpZy50aXRsZS5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5jb25maWcudGl0bGUpLHR9LGkuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBzKHMoe30se3BsYWNlbWVudDp0LG1vZGlmaWVyczp7b2Zmc2V0OnRoaXMuX2dldE9mZnNldCgpLGZsaXA6e2JlaGF2aW9yOnRoaXMuY29uZmlnLmZhbGxiYWNrUGxhY2VtZW50fSxhcnJvdzp7ZWxlbWVudDoiLiIrdGhpcy5jb25zdHJ1Y3Rvci5OQU1FKyItYXJyb3cifSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiBlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9fSksdGhpcy5jb25maWcucG9wcGVyQ29uZmlnKX0saS5fYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3RoaXMuZ2V0VGlwRWxlbWVudCgpLmNsYXNzTGlzdC5hZGQoImJzLXRvb2x0aXAtIit0KX0saS5fZ2V0T2Zmc2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXt9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmNvbmZpZy5vZmZzZXQ/ZS5mbj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRzPXMocyh7fSxlLm9mZnNldHMpLHQuY29uZmlnLm9mZnNldChlLm9mZnNldHMsdC5lbGVtZW50KXx8e30pLGV9OmUub2Zmc2V0PXRoaXMuY29uZmlnLm9mZnNldCxlfSxpLl9nZXRDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuY29uZmlnLmNvbnRhaW5lcj9kb2N1bWVudC5ib2R5Om0odGhpcy5jb25maWcuY29udGFpbmVyKT90aGlzLmNvbmZpZy5jb250YWluZXI6bnQuZmluZE9uZSh0aGlzLmNvbmZpZy5jb250YWluZXIpfSxpLl9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBCdFt0LnRvVXBwZXJDYXNlKCldfSxpLl9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpZigiY2xpY2siPT09ZSlxLm9uKHQuZWxlbWVudCx0LmNvbnN0cnVjdG9yLkV2ZW50LkNMSUNLLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC50b2dnbGUoZSl9KSk7ZWxzZSBpZigibWFudWFsIiE9PWUpe3ZhciBuPSJob3ZlciI9PT1lP3QuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjp0LmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4saT0iaG92ZXIiPT09ZT90LmNvbnN0cnVjdG9yLkV2ZW50Lk1PVVNFTEVBVkU6dC5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtxLm9uKHQuZWxlbWVudCxuLHQuY29uZmlnLnNlbGVjdG9yLChmdW5jdGlvbihlKXtyZXR1cm4gdC5fZW50ZXIoZSl9KSkscS5vbih0LmVsZW1lbnQsaSx0LmNvbmZpZy5zZWxlY3RvciwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2xlYXZlKGUpfSkpfX0pKSx0aGlzLl9oaWRlTW9kYWxIYW5kbGVyPWZ1bmN0aW9uKCl7dC5lbGVtZW50JiZ0LmhpZGUoKX0scS5vbih0aGlzLmVsZW1lbnQuY2xvc2VzdCgiLm1vZGFsIiksImhpZGUuYnMubW9kYWwiLHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIpLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPXMocyh7fSx0aGlzLmNvbmZpZykse30se3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSxpLl9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LGkuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNpbiI9PT10LnR5cGU/ImZvY3VzIjoiaG92ZXIiXT0hMCksZS5nZXRUaXBFbGVtZW50KCkuY2xhc3NMaXN0LmNvbnRhaW5zKCJzaG93Iil8fCJzaG93Ij09PWUuX2hvdmVyU3RhdGU/ZS5faG92ZXJTdGF0ZT0ic2hvdyI6KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJzaG93IixlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7InNob3ciPT09ZS5faG92ZXJTdGF0ZSYmZS5zaG93KCl9KSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LGkuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxMKHQudGFyZ2V0LG4pKXx8KGU9bmV3IHRoaXMuY29uc3RydWN0b3IodC50YXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSksVCh0LnRhcmdldCxuLGUpKSx0JiYoZS5fYWN0aXZlVHJpZ2dlclsiZm9jdXNvdXQiPT09dC50eXBlPyJmb2N1cyI6ImhvdmVyIl09ITEpLGUuX2lzV2l0aEFjdGl2ZVRyaWdnZXIoKXx8KGNsZWFyVGltZW91dChlLl90aW1lb3V0KSxlLl9ob3ZlclN0YXRlPSJvdXQiLGUuY29uZmlnLmRlbGF5JiZlLmNvbmZpZy5kZWxheS5oaWRlP2UuX3RpbWVvdXQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXsib3V0Ij09PWUuX2hvdmVyU3RhdGUmJmUuaGlkZSgpfSksZS5jb25maWcuZGVsYXkuaGlkZSk6ZS5oaWRlKCkpfSxpLl9pc1dpdGhBY3RpdmVUcmlnZ2VyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZVRyaWdnZXIpaWYodGhpcy5fYWN0aXZlVHJpZ2dlclt0XSlyZXR1cm4hMDtyZXR1cm4hMX0saS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3ZhciBlPWV0LmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuZWxlbWVudCk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpey0xIT09UnQuaW5kZXhPZih0KSYmZGVsZXRlIGVbdF19KSksdCYmIm9iamVjdCI9PXR5cGVvZiB0LmNvbnRhaW5lciYmdC5jb250YWluZXIuanF1ZXJ5JiYodC5jb250YWluZXI9dC5jb250YWluZXJbMF0pLCJudW1iZXIiPT10eXBlb2YodD1zKHMocyh7fSx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHQpLGUpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSx2KFB0LHQsdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSksdC5zYW5pdGl6ZSYmKHQudGVtcGxhdGU9anQodC50ZW1wbGF0ZSx0LndoaXRlTGlzdCx0LnNhbml0aXplRm4pKSx0fSxpLl9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSxpLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCksZT10LmdldEF0dHJpYnV0ZSgiY2xhc3MiKS5tYXRjaCh4dCk7bnVsbCE9PWUmJmUubGVuZ3RoPjAmJmUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZShlKX0pKX0saS5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5zdGFuY2U7dGhpcy50aXA9ZS5wb3BwZXIsdGhpcy5fY2xlYW5UaXBDbGFzcygpLHRoaXMuX2FkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LGkuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJih0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiKSx0aGlzLmNvbmZpZy5hbmltYXRpb249ITEsdGhpcy5oaWRlKCksdGhpcy5zaG93KCksdGhpcy5jb25maWcuYW5pbWF0aW9uPWUpfSxlLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9vbHRpcCIpLGk9Im9iamVjdCI9PXR5cGVvZiB0JiZ0O2lmKChufHwhL2Rpc3Bvc2V8aGlkZS8udGVzdCh0KSkmJihufHwobj1uZXcgZSh0aGlzLGkpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1uW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7blt0XSgpfX0pKX0sZS5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy50b29sdGlwIil9LG4oZSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBNdH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBQdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMudG9vbHRpcCJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnRvb2x0aXAifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBIdH19XSksZX0oKSxGdD1FKCk7aWYoRnQpe3ZhciBXdD1GdC5mbltQdF07RnQuZm5bUHRdPVV0LmpRdWVyeUludGVyZmFjZSxGdC5mbltQdF0uQ29uc3RydWN0b3I9VXQsRnQuZm5bUHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gRnQuZm5bUHRdPVd0LFV0LmpRdWVyeUludGVyZmFjZX19dmFyIFZ0PSJwb3BvdmVyIixxdD1uZXcgUmVnRXhwKCIoXnxcXHMpYnMtcG9wb3ZlclxcUysiLCJnIiksenQ9cyhzKHt9LFV0LkRlZmF1bHQpLHt9LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0icG9wb3Zlci1hcnJvdyI+PC9kaXY+PGgzIGNsYXNzPSJwb3BvdmVyLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJwb3BvdmVyLWJvZHkiPjwvZGl2PjwvZGl2Pid9KSxLdD1zKHMoe30sVXQuRGVmYXVsdFR5cGUpLHt9LHtjb250ZW50OiIoc3RyaW5nfGVsZW1lbnR8ZnVuY3Rpb24pIn0pLFh0PXtISURFOiJoaWRlLmJzLnBvcG92ZXIiLEhJRERFTjoiaGlkZGVuLmJzLnBvcG92ZXIiLFNIT1c6InNob3cuYnMucG9wb3ZlciIsU0hPV046InNob3duLmJzLnBvcG92ZXIiLElOU0VSVEVEOiJpbnNlcnRlZC5icy5wb3BvdmVyIixDTElDSzoiY2xpY2suYnMucG9wb3ZlciIsRk9DVVNJTjoiZm9jdXNpbi5icy5wb3BvdmVyIixGT0NVU09VVDoiZm9jdXNvdXQuYnMucG9wb3ZlciIsTU9VU0VFTlRFUjoibW91c2VlbnRlci5icy5wb3BvdmVyIixNT1VTRUxFQVZFOiJtb3VzZWxlYXZlLmJzLnBvcG92ZXIifSxZdD1mdW5jdGlvbih0KXt2YXIgZSxpO2Z1bmN0aW9uIG8oKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9aT10LChlPW8pLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuX19wcm90b19fPWk7dmFyIHM9by5wcm90b3R5cGU7cmV0dXJuIHMuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0scy5zZXRDb250ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRUaXBFbGVtZW50KCk7dGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1oZWFkZXIiLHQpLHRoaXMuZ2V0VGl0bGUoKSk7dmFyIGU9dGhpcy5fZ2V0Q29udGVudCgpOyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoZT1lLmNhbGwodGhpcy5lbGVtZW50KSksdGhpcy5zZXRFbGVtZW50Q29udGVudChudC5maW5kT25lKCIucG9wb3Zlci1ib2R5Iix0KSxlKSx0LmNsYXNzTGlzdC5yZW1vdmUoImZhZGUiLCJzaG93Iil9LHMuX2FkZEF0dGFjaG1lbnRDbGFzcz1mdW5jdGlvbih0KXt0aGlzLmdldFRpcEVsZW1lbnQoKS5jbGFzc0xpc3QuYWRkKCJicy1wb3BvdmVyLSIrdCl9LHMuX2dldENvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1jb250ZW50Iil8fHRoaXMuY29uZmlnLmNvbnRlbnR9LHMuX2NsZWFuVGlwQ2xhc3M9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLm1hdGNoKHF0KTtudWxsIT09ZSYmZS5sZW5ndGg+MCYmZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QucmVtb3ZlKGUpfSkpfSxvLmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBlPUwodGhpcywiYnMucG9wb3ZlciIpLG49Im9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbDtpZigoZXx8IS9kaXNwb3NlfGhpZGUvLnRlc3QodCkpJiYoZXx8KGU9bmV3IG8odGhpcyxuKSxUKHRoaXMsImJzLnBvcG92ZXIiLGUpKSwic3RyaW5nIj09dHlwZW9mIHQpKXtpZih2b2lkIDA9PT1lW3RdKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJyt0KyciJyk7ZVt0XSgpfX0pKX0sby5nZXRJbnN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gTCh0LCJicy5wb3BvdmVyIil9LG4obyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB6dH19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBWdH19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iYnMucG9wb3ZlciJ9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFh0fX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iLmJzLnBvcG92ZXIifX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBLdH19XSksb30oVXQpLCR0PUUoKTtpZigkdCl7dmFyIEd0PSR0LmZuW1Z0XTskdC5mbltWdF09WXQualF1ZXJ5SW50ZXJmYWNlLCR0LmZuW1Z0XS5Db25zdHJ1Y3Rvcj1ZdCwkdC5mbltWdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiAkdC5mbltWdF09R3QsWXQualF1ZXJ5SW50ZXJmYWNlfX12YXIgWnQ9InNjcm9sbHNweSIsSnQ9e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sdGU9e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIG49dGhpczt0aGlzLl9lbGVtZW50PXQsdGhpcy5fc2Nyb2xsRWxlbWVudD0iQk9EWSI9PT10LnRhZ05hbWU/d2luZG93OnQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9zZWxlY3Rvcj10aGlzLl9jb25maWcudGFyZ2V0KyIgLm5hdi1saW5rLCIrdGhpcy5fY29uZmlnLnRhcmdldCsiIC5saXN0LWdyb3VwLWl0ZW0sIit0aGlzLl9jb25maWcudGFyZ2V0KyIgLmRyb3Bkb3duLWl0ZW0iLHRoaXMuX29mZnNldHM9W10sdGhpcy5fdGFyZ2V0cz1bXSx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9MCxxLm9uKHRoaXMuX3Njcm9sbEVsZW1lbnQsInNjcm9sbC5icy5zY3JvbGxzcHkiLChmdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzcyh0KX0pKSx0aGlzLnJlZnJlc2goKSx0aGlzLl9wcm9jZXNzKCksVCh0LCJicy5zY3JvbGxzcHkiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93PyJvZmZzZXQiOiJwb3NpdGlvbiIsbj0iYXV0byI9PT10aGlzLl9jb25maWcubWV0aG9kP2U6dGhpcy5fY29uZmlnLm1ldGhvZCxpPSJwb3NpdGlvbiI9PT1uP3RoaXMuX2dldFNjcm9sbFRvcCgpOjA7dGhpcy5fb2Zmc2V0cz1bXSx0aGlzLl90YXJnZXRzPVtdLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9nZXRTY3JvbGxIZWlnaHQoKSxudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlLG89Zih0KTtpZihvJiYoZT1udC5maW5kT25lKG8pKSxlKXt2YXIgcz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHMud2lkdGh8fHMuaGVpZ2h0KXJldHVybltldFtuXShlKS50b3AraSxvXX1yZXR1cm4gbnVsbH0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Ll9vZmZzZXRzLnB1c2goZVswXSksdC5fdGFyZ2V0cy5wdXNoKGVbMV0pfSkpfSxlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtDKHRoaXMuX2VsZW1lbnQsImJzLnNjcm9sbHNweSIpLHEub2ZmKHRoaXMuX3Njcm9sbEVsZW1lbnQsIi5icy5zY3JvbGxzcHkiKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1zKHMoe30sSnQpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0JiZtKHQudGFyZ2V0KSl7dmFyIGU9dC50YXJnZXQuaWQ7ZXx8KGU9dShadCksdC50YXJnZXQuaWQ9ZSksdC50YXJnZXQ9IiMiK2V9cmV0dXJuIHYoWnQsdCx0ZSksdH0sZS5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sZS5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sZS5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSxlLl9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLHQ+PW4pe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmdGhpcy5fb2Zmc2V0c1swXT4wKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciBvPXRoaXMuX29mZnNldHMubGVuZ3RoO28tLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbb10mJnQ+PXRoaXMuX29mZnNldHNbb10mJih2b2lkIDA9PT10aGlzLl9vZmZzZXRzW28rMV18fHQ8dGhpcy5fb2Zmc2V0c1tvKzFdKSYmdGhpcy5fYWN0aXZhdGUodGhpcy5fdGFyZ2V0c1tvXSl9fX0sZS5fYWN0aXZhdGU9ZnVuY3Rpb24odCl7dGhpcy5fYWN0aXZlVGFyZ2V0PXQsdGhpcy5fY2xlYXIoKTt2YXIgZT10aGlzLl9zZWxlY3Rvci5zcGxpdCgiLCIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUrJ1tkYXRhLXRhcmdldD0iJyt0KyciXSwnK2UrJ1tocmVmPSInK3QrJyJdJ30pKSxuPW50LmZpbmRPbmUoZS5qb2luKCIsIikpO24uY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1pdGVtIik/KG50LmZpbmRPbmUoIi5kcm9wZG93bi10b2dnbGUiLG4uY2xvc2VzdCgiLmRyb3Bkb3duIikpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG4uY2xhc3NMaXN0LmFkZCgiYWN0aXZlIikpOihuLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpLG50LnBhcmVudHMobiwiLm5hdiwgLmxpc3QtZ3JvdXAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtudC5wcmV2KHQsIi5uYXYtbGluaywgLmxpc3QtZ3JvdXAtaXRlbSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLG50LnByZXYodCwiLm5hdi1pdGVtIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7bnQuY2hpbGRyZW4odCwiLm5hdi1saW5rIikuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIil9KSl9KSl9KSkpLHEudHJpZ2dlcih0aGlzLl9zY3JvbGxFbGVtZW50LCJhY3RpdmF0ZS5icy5zY3JvbGxzcHkiLHtyZWxhdGVkVGFyZ2V0OnR9KX0sZS5fY2xlYXI9ZnVuY3Rpb24oKXtudC5maW5kKHRoaXMuX3NlbGVjdG9yKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5jb250YWlucygiYWN0aXZlIil9KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSl9LHQualF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49TCh0aGlzLCJicy5zY3JvbGxzcHkiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0oKX19KSl9LHQuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIEwodCwiYnMuc2Nyb2xsc3B5Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBKdH19XSksdH0oKTtxLm9uKHdpbmRvdywibG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGkiLChmdW5jdGlvbigpe250LmZpbmQoJ1tkYXRhLXNweT0ic2Nyb2xsIl0nKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGVlKHQsZXQuZ2V0RGF0YUF0dHJpYnV0ZXModCkpfSkpfSkpO3ZhciBuZT1FKCk7aWYobmUpe3ZhciBpZT1uZS5mbltadF07bmUuZm5bWnRdPWVlLmpRdWVyeUludGVyZmFjZSxuZS5mbltadF0uQ29uc3RydWN0b3I9ZWUsbmUuZm5bWnRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmUuZm5bWnRdPWllLGVlLmpRdWVyeUludGVyZmFjZX19dmFyIG9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9lbGVtZW50PXQsVCh0aGlzLl9lbGVtZW50LCJicy50YWIiLHRoaXMpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnNob3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoImFjdGl2ZSIpfHx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSkpe3ZhciBlLG49ZCh0aGlzLl9lbGVtZW50KSxpPXRoaXMuX2VsZW1lbnQuY2xvc2VzdCgiLm5hdiwgLmxpc3QtZ3JvdXAiKTtpZihpKXt2YXIgbz0iVUwiPT09aS5ub2RlTmFtZXx8Ik9MIj09PWkubm9kZU5hbWU/IjpzY29wZSA+IGxpID4gLmFjdGl2ZSI6Ii5hY3RpdmUiO2U9KGU9bnQuZmluZChvLGkpKVtlLmxlbmd0aC0xXX12YXIgcz1udWxsO2lmKGUmJihzPXEudHJpZ2dlcihlLCJoaWRlLmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6dGhpcy5fZWxlbWVudH0pKSwhKHEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRhYiIse3JlbGF0ZWRUYXJnZXQ6ZX0pLmRlZmF1bHRQcmV2ZW50ZWR8fG51bGwhPT1zJiZzLmRlZmF1bHRQcmV2ZW50ZWQpKXt0aGlzLl9hY3RpdmF0ZSh0aGlzLl9lbGVtZW50LGkpO3ZhciByPWZ1bmN0aW9uKCl7cS50cmlnZ2VyKGUsImhpZGRlbi5icy50YWIiLHtyZWxhdGVkVGFyZ2V0OnQuX2VsZW1lbnR9KSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudGFiIix7cmVsYXRlZFRhcmdldDplfSl9O24/dGhpcy5fYWN0aXZhdGUobixuLnBhcmVudE5vZGUscik6cigpfX19LGUuZGlzcG9zZT1mdW5jdGlvbigpe0ModGhpcy5fZWxlbWVudCwiYnMudGFiIiksdGhpcy5fZWxlbWVudD1udWxsfSxlLl9hY3RpdmF0ZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcyxvPSghZXx8IlVMIiE9PWUubm9kZU5hbWUmJiJPTCIhPT1lLm5vZGVOYW1lP250LmNoaWxkcmVuKGUsIi5hY3RpdmUiKTpudC5maW5kKCI6c2NvcGUgPiBsaSA+IC5hY3RpdmUiLGUpKVswXSxzPW4mJm8mJm8uY2xhc3NMaXN0LmNvbnRhaW5zKCJmYWRlIikscj1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxvLG4pfTtpZihvJiZzKXt2YXIgYT1nKG8pO28uY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHEub25lKG8sInRyYW5zaXRpb25lbmQiLHIpLF8obyxhKX1lbHNlIHIoKX0sZS5fdHJhbnNpdGlvbkNvbXBsZXRlPWZ1bmN0aW9uKHQsZSxuKXtpZihlKXtlLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpO3ZhciBpPW50LmZpbmRPbmUoIjpzY29wZSA+IC5kcm9wZG93bi1tZW51IC5hY3RpdmUiLGUucGFyZW50Tm9kZSk7aSYmaS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9KHQuY2xhc3NMaXN0LmFkZCgiYWN0aXZlIiksInRhYiI9PT10LmdldEF0dHJpYnV0ZSgicm9sZSIpJiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIsITApLHcodCksdC5jbGFzc0xpc3QuY29udGFpbnMoImZhZGUiKSYmdC5jbGFzc0xpc3QuYWRkKCJzaG93IiksdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCJkcm9wZG93bi1tZW51IikpJiYodC5jbG9zZXN0KCIuZHJvcGRvd24iKSYmbnQuZmluZCgiLmRyb3Bkb3duLXRvZ2dsZSIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpfSkpLHQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCkpO24mJm4oKX0sdC5qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj1MKHRoaXMsImJzLnRhYiIpfHxuZXcgdCh0aGlzKTtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKHZvaWQgMD09PW5bZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTtuW2VdKCl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRhYiIpfSxuKHQsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjUuMC4wLWFscGhhMSJ9fV0pLHR9KCk7cS5vbihkb2N1bWVudCwiY2xpY2suYnMudGFiLmRhdGEtYXBpIiwnW2RhdGEtdG9nZ2xlPSJ0YWIiXSwgW2RhdGEtdG9nZ2xlPSJwaWxsIl0sIFtkYXRhLXRvZ2dsZT0ibGlzdCJdJywoZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLChMKHRoaXMsImJzLnRhYiIpfHxuZXcgb2UodGhpcykpLnNob3coKX0pKTt2YXIgc2U9RSgpO2lmKHNlKXt2YXIgcmU9c2UuZm4udGFiO3NlLmZuLnRhYj1vZS5qUXVlcnlJbnRlcmZhY2Usc2UuZm4udGFiLkNvbnN0cnVjdG9yPW9lLHNlLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHNlLmZuLnRhYj1yZSxvZS5qUXVlcnlJbnRlcmZhY2V9fXZhciBhZT17YW5pbWF0aW9uOiJib29sZWFuIixhdXRvaGlkZToiYm9vbGVhbiIsZGVsYXk6Im51bWJlciJ9LGxlPXthbmltYXRpb246ITAsYXV0b2hpZGU6ITAsZGVsYXk6NTAwfSxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCksVCh0LCJicy50b2FzdCIsdGhpcyl9dmFyIGU9dC5wcm90b3R5cGU7cmV0dXJuIGUuc2hvdz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYoIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJzaG93LmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dGhpcy5fY29uZmlnLmFuaW1hdGlvbiYmdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJmYWRlIik7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3dpbmciKSx0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3ciKSxxLnRyaWdnZXIodC5fZWxlbWVudCwic2hvd24uYnMudG9hc3QiKSx0Ll9jb25maWcuYXV0b2hpZGUmJih0Ll90aW1lb3V0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5oaWRlKCl9KSx0Ll9jb25maWcuZGVsYXkpKX07aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRlIiksdyh0aGlzLl9lbGVtZW50KSx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoInNob3dpbmciKSx0aGlzLl9jb25maWcuYW5pbWF0aW9uKXt2YXIgbj1nKHRoaXMuX2VsZW1lbnQpO3Eub25lKHRoaXMuX2VsZW1lbnQsInRyYW5zaXRpb25lbmQiLGUpLF8odGhpcy5fZWxlbWVudCxuKX1lbHNlIGUoKX19LGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSYmIXEudHJpZ2dlcih0aGlzLl9lbGVtZW50LCJoaWRlLmJzLnRvYXN0IikuZGVmYXVsdFByZXZlbnRlZCl7dmFyIGU9ZnVuY3Rpb24oKXt0Ll9lbGVtZW50LmNsYXNzTGlzdC5hZGQoImhpZGUiKSxxLnRyaWdnZXIodC5fZWxlbWVudCwiaGlkZGVuLmJzLnRvYXN0Iil9O2lmKHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2hvdyIpLHRoaXMuX2NvbmZpZy5hbmltYXRpb24pe3ZhciBuPWcodGhpcy5fZWxlbWVudCk7cS5vbmUodGhpcy5fZWxlbWVudCwidHJhbnNpdGlvbmVuZCIsZSksXyh0aGlzLl9lbGVtZW50LG4pfWVsc2UgZSgpfX0sZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygic2hvdyIpJiZ0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKSxxLm9mZih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiksQyh0aGlzLl9lbGVtZW50LCJicy50b2FzdCIpLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9jb25maWc9bnVsbH0sZS5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PXMocyhzKHt9LGxlKSxldC5nZXREYXRhQXR0cmlidXRlcyh0aGlzLl9lbGVtZW50KSksIm9iamVjdCI9PXR5cGVvZiB0JiZ0P3Q6e30pLHYoInRvYXN0Iix0LHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpLHR9LGUuX3NldExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5vbih0aGlzLl9lbGVtZW50LCJjbGljay5kaXNtaXNzLmJzLnRvYXN0IiwnW2RhdGEtZGlzbWlzcz0idG9hc3QiXScsKGZ1bmN0aW9uKCl7cmV0dXJuIHQuaGlkZSgpfSkpfSx0LmpRdWVyeUludGVyZmFjZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3ZhciBuPUwodGhpcywiYnMudG9hc3QiKTtpZihufHwobj1uZXcgdCh0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSkpLCJzdHJpbmciPT10eXBlb2YgZSl7aWYodm9pZCAwPT09bltlXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrZSsnIicpO25bZV0odGhpcyl9fSkpfSx0LmdldEluc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBMKHQsImJzLnRvYXN0Iil9LG4odCxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNS4wLjAtYWxwaGExIn19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYWV9fSx7a2V5OiJEZWZhdWx0IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbGV9fV0pLHR9KCksdWU9RSgpO2lmKHVlKXt2YXIgaGU9dWUuZm4udG9hc3Q7dWUuZm4udG9hc3Q9Y2UualF1ZXJ5SW50ZXJmYWNlLHVlLmZuLnRvYXN0LkNvbnN0cnVjdG9yPWNlLHVlLmZuLnRvYXN0Lm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdWUuZm4udG9hc3Q9aGUsY2UualF1ZXJ5SW50ZXJmYWNlfX1yZXR1cm57QWxlcnQ6SyxCdXR0b246JCxDYXJvdXNlbDpsdCxDb2xsYXBzZTpndCxEcm9wZG93bjp3dCxNb2RhbDpDdCxQb3BvdmVyOll0LFNjcm9sbFNweTplZSxUYWI6b2UsVG9hc3Q6Y2UsVG9vbHRpcDpVdH19KSk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb3RzdHJhcC5taW4uanMubWFw")
- tmpls["js/content.js"] = tostring("Ly8gU2V0dXAgaW5wdXRzIGZvciBjb250ZW50IGNyZWF0ZS91cGRhdGUuCihmdW5jdGlvbigpIHsgCgogIC8vIFNhdmUgYnV0dG9uIAogIHZhciBzYXZlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdmFsdWU9U2F2ZV0nKQogIGZvciAodmFyIGkgPSAwOyBpIDwgc2F2ZUJ0bi5sZW5ndGg7IGkrKykgeyAKICAgIChmdW5jdGlvbihpLCBzYXZlQnRuKSB7IAogICAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gY29udGVudFVwZGF0ZShlKSB7IAogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtW2FjdGlvbj0iL2NvbnRlbnQiXScpLnN1Ym1pdCgpCiAgICAgIH0pCiAgICB9KShpLCBzYXZlQnRuW2ldKTsKICB9CgogIC8vIEhUTUwKICB0aW55bWNlLmluaXQoeyAKICAgIGVuZF9jb250YWluZXJfb25fZW1wdHlfYmxvY2s6IHRydWUsCiAgICByZWxhdGl2ZV91cmxzOiBmYWxzZSwKICAgIGNvbnZlcnRfdXJsczogZmFsc2UsCiAgICByZW1vdmVfc2NyaXB0X2hvc3Q6IGZhbHNlLAogICAgYWxsb3dfc2NyaXB0X3VybHM6IHRydWUsCiAgICBicm93c2VyX3NwZWxsY2hlY2s6IHRydWUsCiAgICBmb3JjZWRfcm9vdF9ibG9jazogZmFsc2UsCiAgICBicmFuZGluZzogZmFsc2UsCiAgICBkcmFnZ2FibGVfbW9kYWw6IHRydWUsCiAgICBtb2JpbGU6IHsgbWVudWJhcjogdHJ1ZSB9LAogICAgc3RhdHVzYmFyOiBmYWxzZSwKICAgIHNlbGVjdG9yOiAndGV4dGFyZWEuaW5wdXQtaHRtbCcsCiAgICBwbHVnaW5zOiAiYXV0b3Jlc2l6ZSxjb2RlIiwKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy9jc3MvdGlueW1jZS5jc3MiLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSkKCiAgLy8gTUFSS0RPV04KICB0aW55bWNlLmluaXQoewogICAgZW5kX2NvbnRhaW5lcl9vbl9lbXB0eV9ibG9jazogdHJ1ZSwKICAgIHJlbGF0aXZlX3VybHM6IGZhbHNlLAogICAgY29udmVydF91cmxzOiBmYWxzZSwKICAgIHJlbW92ZV9zY3JpcHRfaG9zdDogZmFsc2UsCiAgICBhbGxvd19zY3JpcHRfdXJsczogdHJ1ZSwKICAgIGJyb3dzZXJfc3BlbGxjaGVjazogdHJ1ZSwKICAgIGZvcmNlZF9yb290X2Jsb2NrOiBmYWxzZSwKICAgIGJyYW5kaW5nOiBmYWxzZSwKICAgIGRyYWdnYWJsZV9tb2RhbDogdHJ1ZSwKICAgIG1vYmlsZTogeyBtZW51YmFyOiB0cnVlIH0sCiAgICBzdGF0dXNiYXI6IGZhbHNlLAogICAgc2VsZWN0b3I6ICJ0ZXh0YXJlYS5pbnB1dC1tYXJrZG93biIsCiAgICBwbHVnaW46ICdhdXRvcmVzaXplLHRleHRwYXR0ZXJuJywKICAgIGV4dGVybmFsX3BsdWdpbnM6IHsgCiAgICAgIHRleHRwYXR0ZXJuOiAnLy91bnBrZy5jb20vdGlueW1jZUA1LjIuMC9wbHVnaW5zL3RleHRwYXR0ZXJuL3BsdWdpbi5taW4uanMnCiAgICB9LAogICAgbWVudWJhcjogZmFsc2UsCiAgICB0b29sYmFyOiAndW5kbyByZWRvJywKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy90aW55bWNlLmNzcyIsCiAgICB0ZXh0cGF0dGVybl9wYXR0ZXJuczogWwogICAgICB7c3RhcnQ6ICcqJywgZW5kOiAnKicsIGZvcm1hdDogJ2l0YWxpYyd9LAogICAgICB7c3RhcnQ6ICcqKicsIGVuZDogJyoqJywgZm9ybWF0OiAnYm9sZCd9LAogICAgICB7c3RhcnQ6ICdfJywgZW5kOiAnXycsIGZvcm1hdDogJ2JvbGQnfSwKICAgICAge3N0YXJ0OiAnIycsIGZvcm1hdDogJ2gxJ30sCiAgICAgIHtzdGFydDogJyMjJywgZm9ybWF0OiAnaDInfSwKICAgICAge3N0YXJ0OiAnIyMjJywgZm9ybWF0OiAnaDMnfSwKICAgICAge3N0YXJ0OiAnIyMjIycsIGZvcm1hdDogJ2g0J30sCiAgICAgIHtzdGFydDogJyMjIyMjJywgZm9ybWF0OiAnaDUnfSwKICAgICAge3N0YXJ0OiAnIyMjIyMjJywgZm9ybWF0OiAnaDYnfSwKICAgICAge3N0YXJ0OiAnMS4gJywgY21kOiAnSW5zZXJ0T3JkZXJlZExpc3QnfSwKICAgICAge3N0YXJ0OiAnKiAnLCBjbWQ6ICdJbnNlcnRVbm9yZGVyZWRMaXN0J30sCiAgICAgIHtzdGFydDogJy0gJywgY21kOiAnSW5zZXJ0VW5vcmRlcmVkTGlzdCd9CiAgICBdLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSk7CgogIC8vIFJFRkVSRU5DRSAvIFJFRkVSRU5DRSBMSVNUCiAgdmFyIHJlZnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVmLW1vZGFsJykKICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsgCiAgICB2YXIgcmVmICAgICA9IHJlZnNbaV07CiAgICB2YXIgaW5wdXRzICA9IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgdmFyIG91dHB1dCAgPSBpbnB1dHNbMF07CiAgICB2YXIgYnRuICAgICA9IGlucHV0c1sxXTsKICAgIHZhciBpbnB1dENUID0gaW5wdXRzWzJdOwogICAgdmFyIGlucHV0QyAgPSBpbnB1dHNbM107CiAgICB2YXIgbW9kYWwgICA9IHJlZi5xdWVyeVNlbGVjdG9yKCcubW9kYWwnKTsKICAgIHZhciBjbGVhciAgID0gcmVmLnF1ZXJ5U2VsZWN0b3IoJy5idG4tY2xlYXInKTsKCiAgICAoZnVuY3Rpb24ocmVmLCBvdXRwdXQsIGJ0biwgY29udGVudHR5cGUsIGNvbnRlbnQsIG1vZGFsKSB7CiAgICAgIHZhciBhdXRvQ1QgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgYXV0b0MgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgaXNMaXN0ID0gcmVmLmNsYXNzTmFtZS5pbmRleE9mKCdyZWYtbGlzdCcpICE9IC0xOwoKICAgICAgdmFyIGNob3NlbkNvbnRlbnRUeXBlSUQgLy8gdXNlZCBieSBib3RoCiAgICAgIHZhciBjaG9zZW5Db250ZW50SURzID0gW10gLy8gb25seSB1c2VkIGJlIHJlZiBsaXN0CiAgICAgIHZhciBjaG9zZW5Db250ZW50TmFtZXMgPSBbXSAvLyBvbmx5IHVzZWQgYmUgcmVmIGxpc3QKCiAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24oKSB7IAogICAgICAgIHZhciBvcHRzID0gewogICAgICAgICAgYXV0b3NlbGVjdDogdHJ1ZSwKICAgICAgICAgIGF1dG9zZWxlY3RPbkJsdXI6IHRydWUsIAogICAgICAgICAgdGFiQXV0b2NvbXBsZXRlOiB0cnVlLAogICAgICAgICAgLy8gY2xlYXJPblNlbGVjdGVkOiB0cnVlLAogICAgICAgICAgaGludDogZmFsc2UsCiAgICAgICAgICAvLyBkZWJ1ZzogdHJ1ZQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0b3B0cyh1cmwsIHRyYW5zZm9ybSwgZGlzcGxheUtleSkgeyAKICAgICAgICAgIHZhciBjb250ZW50dHlwZUFib3J0ID0gZnVuY3Rpb24oKSB7fQogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZGlzcGxheUtleTogZGlzcGxheUtleSwKICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbihxdWVyeSwgY2IpIHsgCiAgICAgICAgICAgICAgY2IoW10pCiAgICAgICAgICAgICAgY29udGVudHR5cGVBYm9ydCgpCiAgICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpCiAgICAgICAgICAgICAgY29udGVudHR5cGVBYm9ydCA9IGZ1bmN0aW9uKCkgeyByZXEuYWJvcnQoKSB9IAogICAgICAgICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT0gNCkgewogICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0dXMgIT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3BvbnNlVGV4dCAhPSAiIikgewogICAgICAgICAgICAgICAgICAgIGFsZXJ0KHRoaXMucmVzcG9uc2VUZXh0KQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGNiKFtdKQogICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkgeyAKICAgICAgICAgICAgICAgICAgY2IodHJhbnNmb3JtKEpTT04ucGFyc2UodGhpcy5yZXNwb25zZVRleHQpKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpIHsgCiAgICAgICAgICAgICAgICAgIHZhciBtc2cgPSBlLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgaWYgKG1zZyAhPSAiIikgeyAvLyBDYW5jZWxsZWQgcmVxdWVzdHMgaGl0IHRoaXMuCiAgICAgICAgICAgICAgICAgICAgYWxlcnQobXNnKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlcS5vcGVuKCdHRVQnLCB1cmwoKSArIHF1ZXJ5LCB0cnVlKQogICAgICAgICAgICAgIHJlcS5zZW5kKCkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIGNvbnRlbnR0eXBlT3B0cyA9IGdldG9wdHMoCiAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICcvY29udGVudHR5cGUvc2VhcmNoP3NwYWNlPXt7IC5TcGFjZS5JRCB9fSZxdWVyeT0nOyB9LCAKICAgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHsgcmV0dXJuIGRhdGEuQ29udGVudFR5cGVMaXN0IH0sCiAgICAgICAgICAnQ29udGVudFR5cGVOYW1lJwogICAgICAgICkKCiAgICAgICAgYXV0b0NUID0gd2luZG93LmF1dG9jb21wbGV0ZShjb250ZW50dHlwZSwgb3B0cywgW2NvbnRlbnR0eXBlT3B0c10pLm9uKCdhdXRvY29tcGxldGU6c2VsZWN0ZWQnLCBvbkNvbnRlbnRUeXBlU2VsZWN0ZWQpCiAgICAgICAgZnVuY3Rpb24gb25Db250ZW50VHlwZVNlbGVjdGVkKGUsIGl0ZW0sIGRhdGFzZXQsIGN0eCkgewogICAgICAgICAgY2hvc2VuQ29udGVudFR5cGVJRCA9IGl0ZW0uQ29udGVudFR5cGVJRAogICAgICAgICAgY29udGVudC5kaXNhYmxlZCA9IGZhbHNlCiAgICAgICAgICBjb250ZW50LmZvY3VzKCkKICAgICAgICB9CgogICAgICAgIHZhciBjb250ZW50T3B0cyA9IGdldG9wdHMoCiAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuICcvY29udGVudC9zZWFyY2g/c3BhY2U9e3sgLlNwYWNlLklEIH19JmNvbnRlbnR0eXBlPScgKyBjaG9zZW5Db250ZW50VHlwZUlEICsgJyZxdWVyeT0nOyB9LCAKICAgICAgICAgIGZ1bmN0aW9uKGRhdGEpIHsgCiAgICAgICAgICAgIC8vIEJpZyBoYWNrLgogICAgICAgICAgICBkYXRhID0gZGF0YSA/IGRhdGEuQ29udGVudExpc3QgOiBbXQoKICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGN1cnJlbnQgY29udGVudCBmcm9tIGxpc3QgaWYgYXZhaWxhYmxlLiBUaGlzIAogICAgICAgICAgICAvLyBzaG91bGQgYmUgZG9uZSBvbiB0aGUgc2VydmVyLgogICAgICAgICAgICB7eyBpZiAuQ29udGVudCB9fQogICAgICAgICAgICBkYXRhID0gKGRhdGEgfHwgW10pLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLkNvbnRlbnRJRCAhPSB7eyAuQ29udGVudC5JRCB9fTsgfSk7CiAgICAgICAgICAgIHt7IGVuZCB9fQoKICAgICAgICAgICAgaWYgKGlzTGlzdCkgewogICAgICAgICAgICAgIGRhdGEgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGNob3NlbkNvbnRlbnRJRHMuaW5kZXhPZihpdGVtLkNvbnRlbnRJRCkgPT09IC0xOyB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsgLy8gVGhpcyByZXNwb25zZSBpcyBwYWdlZCwgZG9uJ3Qgd29ycnkgYWJvdXQgT14yLiBNYXggb2YgMjAgaXRlbXMuCgogICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkYXRhW2ldLkNvbnRlbnRWYWx1ZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhW2ldLkNvbnRlbnRWYWx1ZXNbal0uRmllbGROYW1lID09ICJuYW1lIikgeyAvLyBXZSdyZSBndWFyYW50ZWVkIHRvIGhhdmUgdGhpcy4KICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhW2ldLCBkYXRhW2ldLkNvbnRlbnRWYWx1ZXNbal0pCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgICB9LAogICAgICAgICAgJ0ZpZWxkVmFsdWUnCiAgICAgICAgKQoKICAgICAgICAvLyBUT0RPOiBXZWlyZCBiZWhhdmlvciBoZXJlLCB3aHkgZG8gSSBoYXZlIHRvIGlubGluZSB0aGlzIGNsZWFyIG9uCiAgICAgICAgLy8gc2VsZWN0ZWQ/IFdoeSBjYW4ndCBpdCBleGlzdHMgaW4gY29udGVudE9wdHM/CiAgICAgICAgYXV0b0MgPSB3aW5kb3cuYXV0b2NvbXBsZXRlKGNvbnRlbnQsIE9iamVjdC5hc3NpZ24oe30sIG9wdHMsIHtjbGVhck9uU2VsZWN0ZWQ6dHJ1ZX0pLCBbY29udGVudE9wdHNdKS5vbignYXV0b2NvbXBsZXRlOnNlbGVjdGVkJywgb25Db250ZW50U2VsZWN0ZWQpCiAgICAgICAgZnVuY3Rpb24gb25Db250ZW50U2VsZWN0ZWQoZSwgaXRlbSwgZGF0YXNldCwgY3R4KSB7CiAgICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICAgIGNob3NlbkNvbnRlbnRJRHMucHVzaChpdGVtLkNvbnRlbnRJRCkKICAgICAgICAgICAgY2hvc2VuQ29udGVudE5hbWVzLnB1c2goaXRlbS5GaWVsZFZhbHVlKQogICAgICAgICAgICBvdXRwdXQudmFsdWUgPSBjaG9zZW5Db250ZW50SURzCiAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbih2YWwsIGksIHNlbGYpIHsgcmV0dXJuIHNlbGYuaW5kZXhPZih2YWwpID09PSBpIH0pCiAgICAgICAgICAgICAgLmpvaW4oJy0nKQogICAgICAgICAgICBidG4udmFsdWUgPSBjaG9zZW5Db250ZW50TmFtZXMKICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHZhbCwgaSwgc2VsZikgeyByZXR1cm4gc2VsZi5pbmRleE9mKHZhbCkgPT09IGkgfSkKICAgICAgICAgICAgICAuam9pbignLCAnKQogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG91dHB1dC52YWx1ZSA9IGl0ZW0uQ29udGVudElECiAgICAgICAgICAgIGJ0bi52YWx1ZSA9IGl0ZW0uRmllbGRWYWx1ZQogICAgICAgICAgICBib290c3RyYXAuTW9kYWwuZ2V0SW5zdGFuY2UobW9kYWwpLmhpZGUoKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2hpZGRlbi5icy5tb2RhbCcsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpbnB1dENULnZhbHVlID0gJycKICAgICAgICBhdXRvQ1QuYXV0b2NvbXBsZXRlLmRlc3Ryb3koKQogICAgICAgIGF1dG9DVCA9IGZhbHNlOwogICAgICAgIGlucHV0Qy52YWx1ZSA9ICcnCiAgICAgICAgaW5wdXRDLmRpc2FibGVkID0gdHJ1ZQogICAgICAgIGF1dG9DLmF1dG9jb21wbGV0ZS5kZXN0cm95KCkKICAgICAgICBhdXRvQyA9IGZhbHNlOwogICAgICB9KQoKICAgICAgY2xlYXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgCiAgICAgICAgaW5wdXRDVC52YWx1ZSA9ICcnOwogICAgICAgIGlucHV0Qy52YWx1ZSA9ICcnOwogICAgICAgIGlucHV0Qy5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgaW5wdXRDVC5mb2N1cygpOwogICAgICAgIG91dHB1dC52YWx1ZSA9ICcnOwogICAgICAgIGJ0bi52YWx1ZSA9ICdPcGVuJzsKICAgICAgICBjaG9zZW5Db250ZW50VHlwZUlEID0gdm9pZCAwOwogICAgICAgIGNob3NlbkNvbnRlbnRJRHMgPSBbXTsKICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMgPSBbXTsKICAgICAgfSkKCiAgICB9KShyZWYsIG91dHB1dCwgYnRuLCBpbnB1dENULCBpbnB1dEMsIG1vZGFsLCBjbGVhcik7CiAgfQoKfSkoKTsK")
+ tmpls["js/content.js"] = tostring("Ly8gU2V0dXAgaW5wdXRzIGZvciBjb250ZW50IGNyZWF0ZS91cGRhdGUuCihmdW5jdGlvbigpIHsgCgogIC8vIFNhdmUgYnV0dG9uIAogIHZhciBzYXZlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbdmFsdWU9U2F2ZV0nKQogIGZvciAodmFyIGkgPSAwOyBpIDwgc2F2ZUJ0bi5sZW5ndGg7IGkrKykgeyAKICAgIChmdW5jdGlvbihpLCBzYXZlQnRuKSB7IAogICAgICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gY29udGVudFVwZGF0ZShlKSB7IAogICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCkKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtW2FjdGlvbj0iL2NvbnRlbnQiXScpLnN1Ym1pdCgpCiAgICAgIH0pCiAgICB9KShpLCBzYXZlQnRuW2ldKTsKICB9CgogIC8vIEhUTUwKICB0aW55bWNlLmluaXQoeyAKICAgIGVuZF9jb250YWluZXJfb25fZW1wdHlfYmxvY2s6IHRydWUsCiAgICByZWxhdGl2ZV91cmxzOiBmYWxzZSwKICAgIGNvbnZlcnRfdXJsczogZmFsc2UsCiAgICByZW1vdmVfc2NyaXB0X2hvc3Q6IGZhbHNlLAogICAgYWxsb3dfc2NyaXB0X3VybHM6IHRydWUsCiAgICBicm93c2VyX3NwZWxsY2hlY2s6IHRydWUsCiAgICBmb3JjZWRfcm9vdF9ibG9jazogZmFsc2UsCiAgICBicmFuZGluZzogZmFsc2UsCiAgICBkcmFnZ2FibGVfbW9kYWw6IHRydWUsCiAgICBtb2JpbGU6IHsgbWVudWJhcjogdHJ1ZSB9LAogICAgc3RhdHVzYmFyOiBmYWxzZSwKICAgIHNlbGVjdG9yOiAndGV4dGFyZWEuaW5wdXQtaHRtbCcsCiAgICBwbHVnaW5zOiAiYXV0b3Jlc2l6ZSxjb2RlIiwKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy9jc3MvdGlueW1jZS5jc3MiLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSkKCiAgLy8gTUFSS0RPV04KICB0aW55bWNlLmluaXQoewogICAgZW5kX2NvbnRhaW5lcl9vbl9lbXB0eV9ibG9jazogdHJ1ZSwKICAgIHJlbGF0aXZlX3VybHM6IGZhbHNlLAogICAgY29udmVydF91cmxzOiBmYWxzZSwKICAgIHJlbW92ZV9zY3JpcHRfaG9zdDogZmFsc2UsCiAgICBhbGxvd19zY3JpcHRfdXJsczogdHJ1ZSwKICAgIGJyb3dzZXJfc3BlbGxjaGVjazogdHJ1ZSwKICAgIGZvcmNlZF9yb290X2Jsb2NrOiBmYWxzZSwKICAgIGJyYW5kaW5nOiBmYWxzZSwKICAgIGRyYWdnYWJsZV9tb2RhbDogdHJ1ZSwKICAgIG1vYmlsZTogeyBtZW51YmFyOiB0cnVlIH0sCiAgICBzdGF0dXNiYXI6IGZhbHNlLAogICAgc2VsZWN0b3I6ICJ0ZXh0YXJlYS5pbnB1dC1tYXJrZG93biIsCiAgICBwbHVnaW46ICdhdXRvcmVzaXplLHRleHRwYXR0ZXJuJywKICAgIGV4dGVybmFsX3BsdWdpbnM6IHsgCiAgICAgIHRleHRwYXR0ZXJuOiAnLy91bnBrZy5jb20vdGlueW1jZUA1LjIuMC9wbHVnaW5zL3RleHRwYXR0ZXJuL3BsdWdpbi5taW4uanMnCiAgICB9LAogICAgbWVudWJhcjogZmFsc2UsCiAgICB0b29sYmFyOiAndW5kbyByZWRvJywKICAgIGNvbnRlbnRfY3NzOiAiL3N0YXRpYy90aW55bWNlLmNzcyIsCiAgICB0ZXh0cGF0dGVybl9wYXR0ZXJuczogWwogICAgICB7c3RhcnQ6ICcqJywgZW5kOiAnKicsIGZvcm1hdDogJ2l0YWxpYyd9LAogICAgICB7c3RhcnQ6ICcqKicsIGVuZDogJyoqJywgZm9ybWF0OiAnYm9sZCd9LAogICAgICB7c3RhcnQ6ICdfJywgZW5kOiAnXycsIGZvcm1hdDogJ2JvbGQnfSwKICAgICAge3N0YXJ0OiAnIycsIGZvcm1hdDogJ2gxJ30sCiAgICAgIHtzdGFydDogJyMjJywgZm9ybWF0OiAnaDInfSwKICAgICAge3N0YXJ0OiAnIyMjJywgZm9ybWF0OiAnaDMnfSwKICAgICAge3N0YXJ0OiAnIyMjIycsIGZvcm1hdDogJ2g0J30sCiAgICAgIHtzdGFydDogJyMjIyMjJywgZm9ybWF0OiAnaDUnfSwKICAgICAge3N0YXJ0OiAnIyMjIyMjJywgZm9ybWF0OiAnaDYnfSwKICAgICAge3N0YXJ0OiAnMS4gJywgY21kOiAnSW5zZXJ0T3JkZXJlZExpc3QnfSwKICAgICAge3N0YXJ0OiAnKiAnLCBjbWQ6ICdJbnNlcnRVbm9yZGVyZWRMaXN0J30sCiAgICAgIHtzdGFydDogJy0gJywgY21kOiAnSW5zZXJ0VW5vcmRlcmVkTGlzdCd9CiAgICBdLAogICAgc2V0dXA6IGZ1bmN0aW9uKGl0ZW0pIHsgCiAgICAgIGl0ZW0ub24oJ2NoYW5nZScsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpdGVtLnRhcmdldEVsbS52YWx1ZSA9IGl0ZW0uZ2V0Q29udGVudCgpCiAgICAgIH0pCiAgICB9CiAgfSk7CgogIC8vIFJFRkVSRU5DRSAvIFJFRkVSRU5DRSBMSVNUCiAgdmFyIHJlZnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucmVmLW1vZGFsJykKICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsgCiAgICB2YXIgcmVmICAgICA9IHJlZnNbaV07CiAgICB2YXIgaW5wdXRzICA9IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCcpOwogICAgdmFyIG91dHB1dCAgPSBpbnB1dHNbMF07CiAgICB2YXIgYnRuICAgICA9IGlucHV0c1sxXTsKICAgIHZhciBpbnB1dENUID0gaW5wdXRzWzJdOwogICAgdmFyIGlucHV0QyAgPSBpbnB1dHNbM107CiAgICB2YXIgbW9kYWwgICA9IHJlZi5xdWVyeVNlbGVjdG9yKCcubW9kYWwnKTsKICAgIHZhciBjbGVhciAgID0gcmVmLnF1ZXJ5U2VsZWN0b3IoJy5idG4tY2xlYXInKTsKCiAgICAoZnVuY3Rpb24ocmVmLCBvdXRwdXQsIGJ0biwgY29udGVudHR5cGUsIGNvbnRlbnQsIG1vZGFsKSB7CiAgICAgIHZhciBhdXRvQ1QgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgYXV0b0MgPSB7YXV0b2NvbXBsZXRlOntkZXN0cm95OmZ1bmN0aW9uKCl7fX19OwogICAgICB2YXIgaXNMaXN0ID0gcmVmLmNsYXNzTmFtZS5pbmRleE9mKCdyZWYtbGlzdCcpICE9IC0xOwoKICAgICAgdmFyIGNob3NlbkNvbnRlbnRUeXBlSUQ7ICAgICAvLyB1c2VkIGJ5IGJvdGgKICAgICAgdmFyIGNob3NlbkNvbnRlbnRJRHMgPSBbXTsgICAvLyBvbmx5IHVzZWQgYmUgcmVmIGxpc3QKICAgICAgdmFyIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdOyAvLyBvbmx5IHVzZWQgYmUgcmVmIGxpc3QKCiAgICAgIC8vICpTaHV0dGVycyoKICAgICAge3tpZiAuQ29udGVudH19CiAgICAgICAge3tyYW5nZSAka2V5LCAkdmFsIDo9IC5Db250ZW50LlZhbHVlc319CiAgICAgICAgICB7e2lmIGVxICR2YWwuVHlwZSAiUmVmZXJlbmNlTGlzdCJ9fQogICAgICAgICAgICB7e3JhbmdlICRrZXksICR2YWwgOj0gJHZhbC5GaWVsZFJlZmVyZW5jZUxpc3R9fQogICAgICAgICAgICAgIGNob3NlbkNvbnRlbnRJRHMucHVzaCh7eyR2YWwuQ29udGVudElEfX0pOwogICAgICAgICAgICAgIHt7cmFuZ2UgJGtleSwgJHZhbCA6PSAkdmFsLkNvbnRlbnRWYWx1ZXN9fQogICAgICAgICAgICAgICAge3tpZiBlcSAkdmFsLkZpZWxkTmFtZSAibmFtZSJ9fQogICAgICAgICAgICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMucHVzaCh7ey5GaWVsZFZhbHVlfX0pOwogICAgICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAgICAgIHt7ZW5kfX0KICAgICAgICAgICAge3tlbmR9fQogICAgICAgICAge3tlbmR9fQogICAgICAgIHt7ZW5kfX0KICAgICAge3tlbmR9fQoKICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignc2hvd24uYnMubW9kYWwnLCBmdW5jdGlvbigpIHsgCiAgICAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgICBhdXRvc2VsZWN0OiB0cnVlLAogICAgICAgICAgYXV0b3NlbGVjdE9uQmx1cjogdHJ1ZSwgCiAgICAgICAgICB0YWJBdXRvY29tcGxldGU6IHRydWUsCiAgICAgICAgICAvLyBjbGVhck9uU2VsZWN0ZWQ6IHRydWUsCiAgICAgICAgICBoaW50OiBmYWxzZSwKICAgICAgICAgIC8vIGRlYnVnOiB0cnVlCiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRvcHRzKHVybCwgdHJhbnNmb3JtLCBkaXNwbGF5S2V5KSB7IAogICAgICAgICAgdmFyIGNvbnRlbnR0eXBlQWJvcnQgPSBmdW5jdGlvbigpIHt9CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBkaXNwbGF5S2V5OiBkaXNwbGF5S2V5LAogICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKHF1ZXJ5LCBjYikgeyAKICAgICAgICAgICAgICBjYihbXSkKICAgICAgICAgICAgICBjb250ZW50dHlwZUFib3J0KCkKICAgICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkKICAgICAgICAgICAgICBjb250ZW50dHlwZUFib3J0ID0gZnVuY3Rpb24oKSB7IHJlcS5hYm9ydCgpIH0gCiAgICAgICAgICAgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSAhPSA0KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXR1cyAhPSAyMDApIHsKICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VUZXh0ICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgYWxlcnQodGhpcy5yZXNwb25zZVRleHQpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgY2IoW10pCiAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyeSB7IAogICAgICAgICAgICAgICAgICBjYih0cmFuc2Zvcm0oSlNPTi5wYXJzZSh0aGlzLnJlc3BvbnNlVGV4dCkpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2goZSkgeyAKICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGUudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICBpZiAobXNnICE9ICIiKSB7IC8vIENhbmNlbGxlZCByZXF1ZXN0cyBoaXQgdGhpcy4KICAgICAgICAgICAgICAgICAgICBhbGVydChtc2cpCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCgpICsgcXVlcnksIHRydWUpCiAgICAgICAgICAgICAgcmVxLnNlbmQoKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgY29udGVudHR5cGVPcHRzID0gZ2V0b3B0cygKICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gJy9jb250ZW50dHlwZS9zZWFyY2g/c3BhY2U9e3sgLlNwYWNlLklEIH19JnF1ZXJ5PSc7IH0sIAogICAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyByZXR1cm4gZGF0YS5Db250ZW50VHlwZUxpc3QgfSwKICAgICAgICAgICdDb250ZW50VHlwZU5hbWUnCiAgICAgICAgKQoKICAgICAgICBhdXRvQ1QgPSB3aW5kb3cuYXV0b2NvbXBsZXRlKGNvbnRlbnR0eXBlLCBvcHRzLCBbY29udGVudHR5cGVPcHRzXSkub24oJ2F1dG9jb21wbGV0ZTpzZWxlY3RlZCcsIG9uQ29udGVudFR5cGVTZWxlY3RlZCkKICAgICAgICBmdW5jdGlvbiBvbkNvbnRlbnRUeXBlU2VsZWN0ZWQoZSwgaXRlbSwgZGF0YXNldCwgY3R4KSB7CiAgICAgICAgICBjaG9zZW5Db250ZW50VHlwZUlEID0gaXRlbS5Db250ZW50VHlwZUlECiAgICAgICAgICBjb250ZW50LmRpc2FibGVkID0gZmFsc2UKICAgICAgICAgIGNvbnRlbnQuZm9jdXMoKQogICAgICAgIH0KCiAgICAgICAgdmFyIGNvbnRlbnRPcHRzID0gZ2V0b3B0cygKICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gJy9jb250ZW50L3NlYXJjaD9zcGFjZT17eyAuU3BhY2UuSUQgfX0mY29udGVudHR5cGU9JyArIGNob3NlbkNvbnRlbnRUeXBlSUQgKyAnJnF1ZXJ5PSc7IH0sIAogICAgICAgICAgZnVuY3Rpb24oZGF0YSkgeyAKICAgICAgICAgICAgLy8gQmlnIGhhY2suCiAgICAgICAgICAgIGRhdGEgPSBkYXRhID8gZGF0YS5Db250ZW50TGlzdCA6IFtdCgogICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgY3VycmVudCBjb250ZW50IGZyb20gbGlzdCBpZiBhdmFpbGFibGUuIFRoaXMgCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBkb25lIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgIHt7IGlmIC5Db250ZW50IH19CiAgICAgICAgICAgIGRhdGEgPSAoZGF0YSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGl0ZW0uQ29udGVudElEICE9IHt7IC5Db250ZW50LklEIH19OyB9KTsKICAgICAgICAgICAge3sgZW5kIH19CgogICAgICAgICAgICBpZiAoaXNMaXN0KSB7CiAgICAgICAgICAgICAgZGF0YSA9IChkYXRhIHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSkgeyByZXR1cm4gY2hvc2VuQ29udGVudElEcy5pbmRleE9mKGl0ZW0uQ29udGVudElEKSA9PT0gLTE7IH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgeyAvLyBUaGlzIHJlc3BvbnNlIGlzIHBhZ2VkLCBkb24ndCB3b3JyeSBhYm91dCBPXjIuIE1heCBvZiAyMCBpdGVtcy4KCiAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGRhdGFbaV0uQ29udGVudFZhbHVlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgaWYgKGRhdGFbaV0uQ29udGVudFZhbHVlc1tqXS5GaWVsZE5hbWUgPT0gIm5hbWUiKSB7IC8vIFdlJ3JlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGlzLgogICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGRhdGFbaV0sIGRhdGFbaV0uQ29udGVudFZhbHVlc1tqXSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICAgIH0sCiAgICAgICAgICAnRmllbGRWYWx1ZScKICAgICAgICApCgogICAgICAgIC8vIFRPRE86IFdlaXJkIGJlaGF2aW9yIGhlcmUsIHdoeSBkbyBJIGhhdmUgdG8gaW5saW5lIHRoaXMgY2xlYXIgb24KICAgICAgICAvLyBzZWxlY3RlZD8gV2h5IGNhbid0IGl0IGV4aXN0cyBpbiBjb250ZW50T3B0cz8KICAgICAgICBhdXRvQyA9IHdpbmRvdy5hdXRvY29tcGxldGUoY29udGVudCwgT2JqZWN0LmFzc2lnbih7fSwgb3B0cywge2NsZWFyT25TZWxlY3RlZDp0cnVlfSksIFtjb250ZW50T3B0c10pLm9uKCdhdXRvY29tcGxldGU6c2VsZWN0ZWQnLCBvbkNvbnRlbnRTZWxlY3RlZCkKICAgICAgICBmdW5jdGlvbiBvbkNvbnRlbnRTZWxlY3RlZChlLCBpdGVtLCBkYXRhc2V0LCBjdHgpIHsKICAgICAgICAgIGlmIChpc0xpc3QpIHsKICAgICAgICAgICAgY2hvc2VuQ29udGVudElEcy5wdXNoKGl0ZW0uQ29udGVudElEKQogICAgICAgICAgICBjaG9zZW5Db250ZW50TmFtZXMucHVzaChpdGVtLkZpZWxkVmFsdWUpCiAgICAgICAgICAgIG91dHB1dC52YWx1ZSA9IGNob3NlbkNvbnRlbnRJRHMKICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKHZhbCwgaSwgc2VsZikgeyByZXR1cm4gc2VsZi5pbmRleE9mKHZhbCkgPT09IGkgfSkKICAgICAgICAgICAgICAuam9pbignLScpCiAgICAgICAgICAgIGJ0bi52YWx1ZSA9IGNob3NlbkNvbnRlbnROYW1lcwogICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24odmFsLCBpLCBzZWxmKSB7IHJldHVybiBzZWxmLmluZGV4T2YodmFsKSA9PT0gaSB9KQogICAgICAgICAgICAgIC5qb2luKCcsICcpCiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgb3V0cHV0LnZhbHVlID0gaXRlbS5Db250ZW50SUQKICAgICAgICAgICAgYnRuLnZhbHVlID0gaXRlbS5GaWVsZFZhbHVlCiAgICAgICAgICAgIGJvb3RzdHJhcC5Nb2RhbC5nZXRJbnN0YW5jZShtb2RhbCkuaGlkZSgpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KQoKICAgICAgbW9kYWwuYWRkRXZlbnRMaXN0ZW5lcignaGlkZGVuLmJzLm1vZGFsJywgZnVuY3Rpb24oKSB7IAogICAgICAgIGlucHV0Q1QudmFsdWUgPSAnJwogICAgICAgIGF1dG9DVC5hdXRvY29tcGxldGUuZGVzdHJveSgpCiAgICAgICAgYXV0b0NUID0gZmFsc2U7CiAgICAgICAgaW5wdXRDLnZhbHVlID0gJycKICAgICAgICBpbnB1dEMuZGlzYWJsZWQgPSB0cnVlCiAgICAgICAgYXV0b0MuYXV0b2NvbXBsZXRlLmRlc3Ryb3koKQogICAgICAgIGF1dG9DID0gZmFsc2U7CiAgICAgIH0pCgogICAgICBjbGVhci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyAKICAgICAgICBpbnB1dENULnZhbHVlID0gJyc7CiAgICAgICAgaW5wdXRDLnZhbHVlID0gJyc7CiAgICAgICAgaW5wdXRDLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICBpbnB1dENULmZvY3VzKCk7CiAgICAgICAgb3V0cHV0LnZhbHVlID0gJyc7CiAgICAgICAgYnRuLnZhbHVlID0gJ09wZW4nOwogICAgICAgIGNob3NlbkNvbnRlbnRUeXBlSUQgPSB2b2lkIDA7CiAgICAgICAgY2hvc2VuQ29udGVudElEcyA9IFtdOwogICAgICAgIGNob3NlbkNvbnRlbnROYW1lcyA9IFtdOwogICAgICB9KQoKICAgIH0pKHJlZiwgb3V0cHV0LCBidG4sIGlucHV0Q1QsIGlucHV0QywgbW9kYWwsIGNsZWFyKTsKICB9Cgp9KSgpOwo=")
tmpls["js/main.js"] = tostring("Ly8gT24gbW9kYWwgb3BlbiBhbHdheXMgZm9jdXMgZmlyc3QgaW5wdXQgb3IgY2xvc2UgYnV0dG9uLiBBbHNvLCBmaXggYm9vdHN0cmFwIAovLyBtb2RhbCBldmVudCBidWJibGluZyBzbyBuZXN0ZWQgbW9kYWxzIHdvcmsuCihmdW5jdGlvbigpIHsgCiAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbCcpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kYWxzLmxlbmd0aDsgaSsrKSB7CiAgICAoZnVuY3Rpb24oaSwgaXRlbSkgeyAKICAgICAgdmFyIGV2ZW50cyA9IFsKICAgICAgICAnc2hvdy5icy5tb2RhbCcsIAogICAgICAgICdzaG93bi5icy5tb2RhbCcsIAogICAgICAgICdoaWRlLmJzLm1vZGFsJywgCiAgICAgICAgJ2hpZGRlbi5icy5tb2RhbCcsIAogICAgICAgICdoaWRlUHJldmVudGVkLmJzLm1vZGFsJwogICAgICBdOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAoZnVuY3Rpb24oaSwgaXRlbSwgZXZlbnQpIHsKICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZnVuY3Rpb24oZSkgeyAKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pKGksIGl0ZW0sIGV2ZW50c1tpXSk7CiAgICAgIH0KCiAgICAgIC8vIERvbid0IGNsb3NlIHBhcmVudCBtb2RhbHMgd2hpbGUgaW4gaW5uZXIuCiAgICAgIHZhciBjbG9zZXJzID0gaXRlbS5xdWVyeVNlbGVjdG9yQWxsKCcqW2RhdGEtZGlzbWlzcy1pbm5lcj0ibW9kYWwiXScpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb3NlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAoZnVuY3Rpb24gKGksIGNsb3NlcikgewogICAgICAgICAgY2xvc2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgeyAKICAgICAgICAgICAgdmFyIHBhcmVudCA9IGNsb3Nlci5jbG9zZXN0KCcubW9kYWwnKTsKICAgICAgICAgICAgaWYgKHBhcmVudCA9PT0gaXRlbSkgewogICAgICAgICAgICAgIGJvb3RzdHJhcC5Nb2RhbC5nZXRJbnN0YW5jZShpdGVtKS5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pKGksIGNsb3NlcnNbaV0pOwogICAgICB9CgogICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3duLmJzLm1vZGFsJywgZnVuY3Rpb24oZSkgeyAKICAgICAgICB2YXIgaW5wdXQgPSBpdGVtLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICAgICAgdmFyIGJ1dHRvbiA9IGl0ZW0ucXVlcnlTZWxlY3RvcignYnV0dG9uJyk7CiAgICAgICAgLy8gU3R1cGlkIGhhY2suIEZvciBzb21lIHJlYXNvbiBib290c3RyYXAgaXMgbWVzc2luZyB3aXRoIHVzIGhlcmUuCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpeyhpbnB1dCB8fCBidXR0b24pLmZvY3VzKCl9LCAxKTsKICAgICAgfSk7CiAgICB9KShpLCBtb2RhbHNbaV0pOwogIH0KfSkoKTsK")