LyoKICogV2luZSBjb21tYW5kIHByb21wdAogKiBDemVjaCBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIENvcHlyaWdodCAoQykgMTk5OSBEIEEgUGlja2xlcwogKiBDb3B5cmlnaHQgKEMpIDIwMDQgRGF2aWQgS3JlZGJhCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfQ1pFQ0gsIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUKewogIFdDTURfQVRUUklCLCAiTuFwb3bsZGEgayBBVFRSSUJcbiIKICBXQ01EX0NBTEwsCiJDQUxMIDxk4XZrb3b9IHNvdWJvcj4gamUgdb7tduFuIGtlIHNwdbl07G7tIHD47WthevlcblwKeiBqaW7paG8gZOF2a2926WhvIHNvdWJvcnUuIEtkeb4gc2UgYuxoIHZvbGFu6WhvIGThdmtvdulobyBzb3Vib3J1IHVrb27o7Swga29udHJvbGEgc2UgdnLhdO1cblwKdm9sYWrtY+1tdSBzb3Vib3J1LiBQ+O1rYXogQ0FMTCBt+b5lIHD4ZWThdmF0IHBhcmFtZXRyeVxuXAp2b2xhbukgcHJvY2VkdfhlLlxuXApcblwKWm3sbnkgdiBkZWZhdWx0bu1tIGFkcmVz4fhpLCBwcm9t7G5u/WNoIHByb3N0+GVk7SBhdGQuLCB1ZOxsYW7pXG5cCnZvbGFub3UgcHJvY2VkdXJvdSBqc291IHpk7GTsbnkgdm9sYWrtY+1tLlxuIgoKICBXQ01EX0NELCAgICAgIk7hcG927GRhIGsgQ0RcbiIKICBXQ01EX0NIRElSLCAgIk7hcG927GRhIGsgQ0hESVJcbiIKCiAgV0NNRF9DTFMsICAgICJDTFMgdnltYb5lIG9icmF6b3ZrdSB0ZXJtaW7hbHVcbiIKCiAgV0NNRF9DT1BZLCAgICJO4XBvduxkYSBrIENPUFlcbiIKICBXQ01EX0NUVFksICAgIk7hcG927GRhIGsgQ1RUWVxuIgogIFdDTURfREFURSwgICAiTuFwb3bsZGEgayBEQVRFXG4iCiAgV0NNRF9ERUwsICAgICJO4XBvduxkYSBrIERFTFxuIgogIFdDTURfRElSLCAgICAiTuFwb3bsZGEgayBESVJcbiIKCiAgV0NNRF9FQ0hPLAoiRUNITyA8+GV07HplYz4gem9icmF67SA8+GV07HplYz4gbmEgcG91vu12YW7pbSB0ZXJtaW7hbG926W0gemH47Xplbu0uXG5cClxuXApFQ0hPIE9OIHpw+XNvYu0sIL5lIHa5ZWNobnkgbuFzbGVkdWrtY+0gcPjta2F6eSB2IGThdmtvdultIHNvdWJvcnUgYnVkb3VcblwKem9icmF6ZW55IG5hIHRlcm1pbuFsb3bpbSB6YfjtemVu7SBw+GVkIHN2/W0gc3B1uXTsbu1tLlxuXApcblwKRUNITyBPRkYgdnlwaXNvduFu7SBw+O1rYXr5IHpha+G+ZSAoRUNITyBqZSBPRkYgZGVmYXVsdG7sLlxuXApQ+GVkc2Fk7S1saSBzZSBw+O1rYXp1IEVDSE8gT0ZGIEAgbmVidWRlIHD47WtheiBFQ0hPIE9GRiB2eXBz4W5cblwKbmEgdGVybWlu4WxvdukgemH47Xplbu0uXG4iCgogIFdDTURfRVJBU0UsICAiTuFwb3bsZGEgayBFUkFTRVxuIgoKICBXQ01EX0ZPUiwKIlD47WtheiBGT1Igdnlrb27hIHphZGFub3UgYWtjaSBwcm8ga2G+ZP0gemUgemFkYW7pIHNrdXBpbnkgc291Ym9y+S5cblwKXG5cClN5bnRheGU6IEZPUiAlcHJvbexubuEgSU4gKHNrdXBpbmEgc291Ym9y+SkgRE8gYWtjZVxuXApcblwKViBwcm9ncmFtdSB3Y21kIG5lbu0gdPhlYmEgemR2b2pvdmF0IHpuYWsgJSBw+GVkIHByb23sbm5vdSBw+GkgcG91vml07SBw+O1rYXp1XG5cIEZPUiB2IGThdmtvdultIHNvdWJvcnUuXG4iCgogIFdDTURfR09UTywKIlD47WtheiBHT1RPIHD4ZWThIHb9a29uIG5hIGppbukgbe1zdG9cblwKdiBk4XZrb3bpbSBzb3Vib3J1LlxuXApcblwKTuF27Ll07Swga3Rlcv1tIHNlIG96bmHodWplIGPtbCBza29rdSBHT1RPIG35vmUgYv10IGG+IDI1NSB6bmFr+VxuXApkbG91aOkuIE5lc23tIHa5YWsgb2JzYWhvdmF0IG1lemVyeSAob2Rsablu6SBjaG924W7tIG9kIGppbv1jaCBvcGVyYehu7WNoXG5cCnN5c3TpbfkpLiBFeGlzdHVq7S1saSBkduwgbmVibyB27WNlIHN0ZWpu/WNoIG7hduy5dO0gdiBqZWRub20gZOF2a2926W1cblwKc291Ym9ydSwgcGFrIHBydm7tIGJ1ZGUgdnlrb27hbm8uIFNrb2sgR09UTyBuYSBuZWV4aXN0dWrtY+0gbuF27Ll07VxuXAp1a29u6O0gdv1rb24gZOF2a2926WhvIHNvdWJvcnUuXG5cClxuXApHT1RPIHNlIG5lZOEgcG91vu10IGludGVyYWt0aXZu7C5cbiIKCiAgV0NNRF9IRUxQLCAgICJO4XBvduxkYSBrIEhFTFBcbiIKCiAgV0NNRF9JRiwKIklGIHNsb3W+7SBrIHBvZG3tbuxu6W11IHb9a29udSBw+O1rYXr5LlxuXApcblwKU3ludGF4ZTogSUYgW05PVF0gRVhJU1Qgc291Ym9yIHD47WthelxuXAoJIElGIFtOT1RdIPhldOx6ZWMxPT34ZXTsemVjMiBw+O1rYXpcblwKCSBJRiBbTk9UXSBFUlJPUkxFVkVMIOjtc2xvIHD47WthelxuXApcblwKVmUgZHJ1aOkgZm9ybewgcPjta2F6dSBtdXPtIGL9dCD4ZXTsemVjMSBhIPhldOx6ZWMyIHV6YXb4ZW55IHYgZHZvaml0/WNoXG5cCnV2b3pvdmvhY2guIFNyb3Zu4W7tIG5lbu0gY2l0bGl26SBuYSB2ZWxpa29zdCBw7XNtZW4uXG4iCgogIFdDTURfTEFCRUwsICAiTEFCRUwgbmFzdGF2dWplIGptZW5vdmt1IHN2YXprdS1kaXNrdS4gIFxuXApcblwKU3ludGF4ZTogTEFCRUwgW2Rpc2s6XVxuXApCdWRldGUgdnl6duFuaSBrIHphZOFu7SBqbWVub3ZreS5cblwKSm1lbm92a3Ugc2kgbfm+ZXRlIHpvYnJheml0IHD47WthemVtIFZPTC5cbiIKCiAgV0NNRF9NRCwgICAgICJO4XBvduxkYSBrIE1EXG4iCiAgV0NNRF9NS0RJUiwgICJO4XBvduxkYSBrIE1LRElSXG4iCiAgV0NNRF9NT1ZFLAoiTU9WRSBw+GVzdW5lIHNvdWJvciDoaSBhZHJlc+H4IG5hIGppbukgbe1zdG8gdiBzb3Vib3JvdultIHN5c3TpbXUuXG5cClxuXApKZS1saSBw+GVzb3V24W4gYWRyZXPh+CwganNvdSBw+GVzdW51dHkgdrllY2hueSBqZWhvIHBvZGFkcmVz4fhlIGEgc291Ym9yeS5cblwKXG5cCk1PVkUgc2VsvmUganNvdS1saSB6ZHJvam924SBhIGPtbG924SBvYmxhc3QgbmEgamVkbm90a+FjaCBzIGppbv1taSBET1MgcO1zbWVueSBkaXNr+S5cbiIKCiAgV0NNRF9QQVRILAoiUEFUSCB6b2JyYXrtIOhpIHpt7G7tIGNlc3R5LCB2IG5pY2i+IHdjbWQgaGxlZOEgc291Ym9yeS5cblwKXG5cClBBVEggYmV6IGFyZ3VtZW50+SB6b2JyYXrtIG1vbWVudOFsbuwgcGxhdG7pIG5hc3RhdmVu7SAocPhlZCBwcnZu7SB6bexub3VcblwKamUgdG8gaG9kbm90YSBw+GV2emF04SB6ZSBzb3Vib3J1IHdpbmUuY29uZikuIEtlIHpt7G7sIHD4aXBvanRlIGsgcPjta2F6dVxuXApQQVRIIG5vdm91IGNlc3R1LlxuXApcblwKSmUgdGFrdOm+IG1vvm7pIHpt7G5pdCBQQVRIIHBvdb5pdO1tIHByb23sbm7pIHByb3N0+GVk7SBQQVRILFxuXApuYXD47WtsYWQ6XG5cCgkJUEFUSCAlUEFUSCU7YzpcXHRlbXAgXG4iCgogIFdDTURfUEFVU0UsCiJQQVVTRSB6b2JyYXrtIG5hIG9icmF6b3ZjZSB0ZXh0ICdQcmVzcyBSZXR1cm4ga2V5IHRvIGNvbnRpbnVlJ1xuXAphIHZ56GvhLCBkb2t1ZCB1vml2YXRlbCBuZXN0aXNrbmUga2zhdmVzdSBFbnRlci4gSmUgdG8gdb5pdGXobukgaGxhdm7sXG5cCnByb3RvLCBhYnkgc2kgdb5pdmF0ZWwgbW9obCBw+GXo7XN0IHb9c3R1cCB6IHb9a29udSBw+GVkY2jhemVq7WNoIHD47WthevksXG5cCm5lviBzZSB0eXRvIG9kcm9sdWrtIHogb2JyYXpvdmt5LlxuIgoKICBXQ01EX1BST01QVCwKIlBST01QVCBuYXN0YXbtIHb9enZ1IHD47Wthem926WhvIPjhZGt1LlxuXApcblwK2GV07HplYyB6YSBw+O1rYXplbSBQUk9NUFQgKGEgbWV6ZXJvdSBiZXpwcm9zdPhlZG7sIHphIFBST01QVClcblwKc2Ugem9icmF67SBuYSB6YejhdGt1IGthvmTpIG5vdukgcPjta2F6b3bpIPjhZGt5LlxuXApcblwKVHl0byB6bmFreSBtYWrtIHYg+GV07Hpj7WNoIHNwZWNp4Wxu7SB2/XpuYW06XG5cClxuXAokJCAgICBabmFrIGRvbGFydSAgICAgICAgICRfICAgIE9k+OFka2924W7tICAgICAgICAgJGIgICAgWm5hayByb3VyeSAofClcblwKJGQgICAgRGF0dW0gICAgICAgICAgICAgICAkZSAgICBFc2NhcGUgICAgICAgICAgICAgICRnICAgIFpuYW3pbmtvIHbsdLntIG5lvlxuXAokbCAgICBabmFt6W5rbyBtZW657SBuZb4gICRuICAgIFDtc21lbm8gZGlza3UgICAgICAgJHAgICAgQ2VzdGFcblwKJHEgICAgUm92bu10a28gICAgICAgICAgICAkdCAgICDIYXMgICAgICAgICAgICAgICAgICR2ICAgIFZlcnplIHdjbWRcblwKXG5cClBST01QVCBiZXogcGFyYW1ldHL5IHJlc2V0dWplIHByb21wdCBuYSBkZWZhdWx0bu0sXG5cCmt0ZXL9IGplIHNsb75lbiB6IGNlc3R5IGsgc2916GFzbultdSBhZHJlc+H4aSAoduhldG7sIHDtc21lbmEgZGlza3VcblwKKSBhIHpuYW3pbmthICB27HS57SBuZb4gKD4pLlxuXAooamFrbyBqZSB2IERPUy11IFBST01QVCAkcCRnKS5cblwKXG5cClByb21wdCBt+b5lIGL9dCB6bexu7G4gaSB6bexub3UgcHJvbexubukgcHJvc3T4ZWTtIFBST01QVCxcblwK6GlsaSBw+O1rYXogJ1NFVCBQUk9NUFQ9dGV4dCcgbeEgdGVudP2+IGVmZWt0IGpha28gJ1BST01QVCB0ZXh0J1xuIgoKICBXQ01EX1JFTSwKItjhZGt5IHph6O1uYWrtY+0gUkVNIChu4XNsZWRvdmFu/W0gbWV6ZXJvdSlcblwKbmVqc291IHZ5a29u4W55LiBSRU0gamUgcHJvdG8gcG91vu124W4gamFrbyBrb21lbnTh+G92/SBw+O1rYXouXG4iCgogIFdDTURfUkVOLCAgICAiTuFwb3bsZGEgayBSRU5cbiIKICBXQ01EX1JFTkFNRSwgIk7hcG927GRhIGsgUkVOQU1FXG4iCiAgV0NNRF9SRCwgICAgICJO4XBvduxkYSBrIFJEXG4iCiAgV0NNRF9STURJUiwgICJO4XBvduxkYSBrIFJNRElSXG4iCgogIFdDTURfU0VULAoiU0VUIHpvYnJheu0gbmVibyB6bexu7SBwcm9t7G5u6SBwcm9zdPhlZO0gd2NtZC5cblwKXG5cClNFVCBiZXogYXJndW1lbnT5IHVr4b5lIHNvdehhc27pIG5hc3RhdmVu7SBwcm9zdPhlZO0uXG5cClxuXApTeW50YXhlIHBybyBuYXN0YXZlbu0gYSB6bexudSBwcm9t7G5u6SBwcm9zdPhlZO0gamU6XG5cClxuXAogICAgICBTRVQgPHByb23sbm7hPj08aG9kbm90YT5cblwKICAgICAgXG5cCiAgICAgIGtkZSA8cHJvbexubuE+IGEgPGhvZG5vdGE+IG11c+0gYv10IHByb3N0YSBtZXplclxuXAogICAgICBhIHNwZWNp4Wxu7WNoIHpuYWv5IGEgbWV6aSA8cHJvbexubuE+IHJvdm7tdGtvIDxob2Rub3RhPlxuXAogICAgICBuZXNt7SBi/XQgbWV6ZXJ5LlxuXAogICAgICBcblwKICAgICAgVmUgV2luZSBqc291IHZpZGl0ZWxu6SBwcm9t7G5u6SBwcm9zdPhlZO0gb3BlcmHobu1ob1xuXAogICAgICBzeXN06W11LCB2ZSBrdGVy6W0gamUgV2luZSBzcHW5dOxuLiBQcm90byB1dmlk7XRlIG1ub2hlbSB27WMgcHJvbexubv1jaFxuXAogICAgICBwcm9zdPhlZO0sIG5lviB1IG5hdGl2bu0gV2luMzIgaW1wbGVtZW50YWNlLiBOZW7tIG1vvm7pXG5cCiAgICAgIG3sbml0IHByb23sbm7pIHByb3N0+GVk7SBob3N0aXRlbHNr6WhvIG9wZXJh6G7taG8gc3lzdOltdSB6IHdjbWQuXG4iCiAgCiAgV0NNRF9TSElGVCwKIlNISUZUIHW+7XbhbiB2IGThdmtvdv1jaCBzb3Vib3JlY2ggayBvZHN0cmFu7G7tIGplZG5vaG8gcGFyYW1ldHJ1IHplIHph6OF0a3VcblwKamVqaWNoIHNlem5hbXUsIHRha75lIHBhcmFtZXRyIDIgc2Ugc3RhbmUgcGFyYW1ldHJlbSAxIGF0ZC4gTmVt4SC+4WRu/VxuXAplZmVrdCwgamUtbGkgemFk4W4gbmEgcPjta2F6b3ZvdSD44WRrdS5cbiIKCiAgV0NNRF9USU1FLCAgICJO4XBvduxkYSBrIFRJTUVcbiIKCiAgV0NNRF9USVRMRSwgICJOYXN0YXbtIHRpdHVsZWsgb2tuYSB3Y21kLCBzeW50YXhlIFRJVExFIFv4ZXTsemVjXVxuIgoKICBXQ01EX1RZUEUsCiJUWVBFIDxzb3Vib3I+IHZ5cO25ZSA8c291Ym9yPiBuYSBrb256b2xvdukgemH47Xplbu0gKG5lYm8gamluYW0sXG5cCmplLWxpIHb9c3R1cCBw+GVt7HJvduFuKS4gTmVu7SB6amm5u2924W5vLCBidWRlLWxpIHZ5cHPhbiDoaXRlbG79IHRleHQuXG4iCgogIFdDTURfVkVSSUZZLAoiVkVSSUZZIGplIHBvdb7tduFuIGsgbmFzdGF2ZW7tIG5lYm8gemppuXTsbu0gc3RhdnUgcPjtem5ha3UgdmVyaWZ5LlxuXApTeW50YXhlOlxuXApcblwKVkVSSUZZIE9OCU5hc3Rhdu0gcPjtem5ha1xuXApWRVJJRlkgT0ZGCVpydbntIHD47XpuYWtcblwKVkVSSUZZCQlab2JyYXrtIGFrdHXhbG7tIHN0YXYuXG5cClxuXApQ+O16bmFrIHZlcmlmeSBuZW3hIHZlIFdpbmUgvuFkbm91IGZ1bmtjaS5cbiIKCiAgV0NNRF9WRVIsCiJWRVIgem9icmF67SB2ZXJ6aSBzcHW5dOxu6WhvIHByb2dyYW11IHdjbWQuXG4iCgogIFdDTURfVk9MLCAgICAiTuFwb3bsZGEgayBWT0xcbiIKCiAgV0NNRF9FWElULAoiRVhJVCB1a29u6O0gYuy+7WPtIHNlemVu7SBhIHZy4XTtIGtvbnRyb2x1XG5cCm9wZXJh6G7tbXUgc3lzdOltdSBuZWJvIHD47Wthem926W11IGludGVycHJldHUsXG5cCnplIGt0ZXLpaG8gYnlsIHdjbWQgc3B1uXTsbi5cbiIKCiAgMTAwMCwgIlZlc3Rhduxu6SBw+O1rYXp5IFdDTUQganNvdTpcblwKQVRUUklCXHRcdFpvYnJheu0gbmVibyBuYXN0YXbtIERPUy1vdnNr6SBzb3Vib3JvdukgYXR0cmlidXR5XG5cCkNBTExcdFx0WmF2b2zhIGThdmtvdv0gc291Ym9yIHogamlu6WhvXG5cCkNEIChDSERJUilcdFpt7G7tIHByYWNvdm7tIGFkcmVz4fhcblwKQ0xTXHRcdFZ5bWG+ZSBva25vIHRlcm1pbuFsdVxuXApDT1BZXHRcdEtvcO1ydWplIHNvdWJvcnlcblwKQ1RUWVx0XHRabexu7SB2c3R1cG7sL3b9c3R1cG7tIHph+O16ZW7tXG5cCkRBVEVcdFx0VWvhvmUgbmVibyBuYXN0YXbtIHN5c3TpbW926SBkYXR1bVxuXApERUwgKEVSQVNFKVx0U21hvmUgamVkZW4gbmVibyB27WNlIHNvdWJvcvlcblwKRElSXHRcdFZ5cO25ZSBvYnNhaCBhZHJlc+H4ZVxuXApFQ0hPXHRcdFZ5cO25ZSB0ZXh0IG5hIHRlcm1pbuFsXG5cCkhFTFBcdFx0Wm9icmF67SBkZXRhaWxu7SBu4XBvduxkdSBrIHTpbWF0dVxuXApNRCAoTUtESVIpXHRWeXR2b/jtIGFkcmVz4fhcblwKTU9WRVx0XHRQ+GVzdW5lIHNvdWJvciwgc2t1cGludSBzb3Vib3L5IG5lYm8gYWRyZXPh+G92/SBzdHJvbVxuXApQQVRIXHRcdE5hc3Rhdu0gbmVibyB1a+G+ZSBwcm9obGVk4XZhbukgY2VzdHlcblwKUFJPTVBUXHRcdFpt7G7tIHb9enZ1IHD47Wthem926WhvIPjhZGt1XG5cClJFTiAoUkVOQU1FKVx0UPhlam1lbnVqZSBzb3Vib3JcblwKUkQgKFJNRElSKVx0U21hvmUgYWRyZXPh+FxuXApTRVRcdFx0TmFzdGF27SBuZWJvIHpvYnJheu0gcHJvbexubm91IHByb3N0+GVk7VxuXApUSU1FXHRcdFVr4b5lIOhpIG5hc3Rhdu0gc3lzdOltb3b9IOhhc1xuXApUSVRMRVx0XHROYXN0YXbtIHRpdHVsZWsgb2tuYSBi7L7tY+0gV0NNRCBpbnN0YW5jZVxuXApUWVBFXHRcdFZ5cO25ZSBvYnNhaCB0ZXh0b3bpaG8gc291Ym9ydVxuXApWRVJcdFx0Wm9icmF67SB2ZXJ6aSBXQ01EXG5cClZPTFx0XHRVa+G+ZSBqbWVub3ZrdSBkaXNrdVxuXApFWElUXHRcdFVrb27o7SBXQ01EXG5cblwKWmFkZWp0ZSBIRUxQIDxw+O1rYXo+IHBybyBwb2Ryb2Ju7Gq57SBpbmZvcm1hY2UgbyBu7Gt0ZXLpbSB6IHb9uWUgdXZlZGVu/WNoIHD47WthevlcbiIKfQo=