<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>P3449R0: constexpr std::generator</title>
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogI0JCQjsKCQktLWZvdW5kLWhpZ2hsaWdodDogYmx1ZTsKCQktLWZvdW5kLXRleHQtY29sb3I6IHdoaXRlOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAzMiwzMiwzMjsKCQktLWhlYWRlci1jb2xvcjogd2hpdGU7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICMxMDEwMTA7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IHdoaXRlOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICM4ZWYzZmY7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICNmMGZmODk7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjYjNmN2ZmOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjYzhmZmIzOwoJCS0tbGluZS1jb2xvcjogMjU1LDI1NSwyNTU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1MiwwLDAuMjUpOwoJfQoJOjpzZWxlY3Rpb24gewoJICBjb2xvcjogYmxhY2s7CgkgIGJhY2tncm91bmQ6IGxpZ2h0eWVsbG93OwoJfQp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewoJOnJvb3QgewoJCS0tdGV4dC1jb2xvcjogYmxhY2s7CgkJLS1mb3VuZC1oaWdobGlnaHQ6IHllbGxvdzsKCQktLWZvdW5kLXRleHQtY29sb3I6IGJsYWNrOwoJCS0tbWFpbi1iYWNrZ3JvdW5kOiAyNTUsMjU1LDI1NTsKCQktLWhlYWRlci1jb2xvcjogYmxhY2s7CgkJLS1ib3gtc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuMyk7CiAgICAtLXRoaW4tYm94LXNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjEpOwoJCS0tbmF2LWJhY2tncm91bmQtY29sb3I6ICNGNUY1RjU7CgkJLS1jb2RlLWZvcmVncm91bmQtY29sb3I6IGJsYWNrOwoJCS0tY29kZS1pbmZvLWNvbG9yOiByZ2JhKDAsMCwwLDAuMSk7CgkJLS1jb2RlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW5hdi1iYWNrZ3JvdW5kLWNvbG9yKTsKCQktLWxpbmstY29sb3I6ICMwMDAwODI7CgkJLS12aXNpdGVkLWxpbmstY29sb3I6ICM1MDhkMGY7CgkJLS1ob3Zlci1saW5rLWNvbG9yOiAjNTc1N2MyOwoJCS0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yOiAjOTRjNTYwOwoJCS0tbGluZS1jb2xvcjogMTIsNDMsNzU7CgkJLS1oZWFkZXItYmFja2dyb3VuZDogMCwwLDA7CgkJLS1xdW90ZS1sZWZ0LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7CgkJLS1oaWdobGlnaHQ6IHJnYmEoMjU1LDI1NCwyMDcsMC41KTsKCX0KCTo6c2VsZWN0aW9uIHsKCSAgY29sb3I6IGJsYWNrOwoJICBiYWNrZ3JvdW5kOiAjYTRjM2Y2OwoJfQp9CgpzcGFuOnRhcmdldCwgcDp0YXJnZXQsIGxpOnRhcmdldCwgZGl2OnRhcmdldCB7CiAgYmFja2dyb3VuZDogdmFyKC0taGlnaGxpZ2h0KTsKfQoKLm5hbWUtb2YtcGFwZXIgewoJZm9udC1zaXplOiAyOHB4OwoJcGFkZGluZy10b3A6IDAuNWVtOwp9CgpzcGFuLmZvdW5kIHsKCXRleHQtc2hhZG93OiAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpLCAgMCAwIDEwcHggdmFyKC0tZm91bmQtaGlnaGxpZ2h0KSwgIDAgMCAxMHB4IHZhcigtLWZvdW5kLWhpZ2hsaWdodCksICAwIDAgMTBweCB2YXIoLS1mb3VuZC1oaWdobGlnaHQpOwoJY29sb3I6IHZhcigtLWZvdW5kLXRleHQtY29sb3IpICFpbXBvcnRhbnQ7Cn0KCmJvZHkgewoJZm9udC1mYW1pbHk6IEhlbHZldGljYTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwoJYmFja2dyb3VuZC1jb2xvcjogcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLCAxKTsKfQoKYm9keSA+IGRpdiB7CglkaXNwbGF5OiBmbGV4OwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLmhpZGUtb24tbmFycm93IHsKCWRpc3BsYXk6IGluaGVyaXQ7Cn0KCi5oaWRlLW9uLXdpZGUgewoJZGlzcGxheTogbm9uZTsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAxMTAwcHgpIHsKCWJvZHkgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7Cgl9CgkuaGlkZS1vbi1uYXJyb3cgewoJCWRpc3BsYXk6IG5vbmU7Cgl9CgkuaGlkZS1vbi13aWRlIHsKCQlkaXNwbGF5OiBpbmhlcml0OwoJfQoJYm9keSA+IGRpdiB7CgkJZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKCX0KCWFydGljbGUgewoJCW92ZXJmbG93OiBpbmhlcml0ICFpbXBvcnRhbnQ7CgkJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCB0cmFuc3BhcmVudCxyZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgcmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuOCksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjYpLCB0cmFuc3BhcmVudCkgIWltcG9ydGFudDsKCX0KCW5hdiwgYXJ0aWNsZSB7CgkJZmxleDogaW5pdGlhbCAhaW1wb3J0YW50OwoJfQoJbmF2IHsKCQltaW4td2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltYXgtd2lkdGg6IGluaXRpYWwgIWltcG9ydGFudDsKCQltaW4taGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7CgkJbWF4LWhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCWJveC1zaGFkb3c6IDAgMTBweCAwIHZhcigtLWJveC1zaGFkb3ctY29sb3IpOwoJfQoJbmF2ID4gZGl2IHsKCQlvdmVyZmxvdzogaW5oZXJpdCAhaW1wb3J0YW50OwoJCXBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OwoJCW1heC13aWR0aDogaW5pdGlhbCAhaW1wb3J0YW50OwoJCW1heC1oZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDsKCX0KCWRpdjpoYXMoPiBpbnB1dFt0eXBlPXNlYXJjaF0pIHsKCQlkaXNwbGF5OiBub25lOwoJfQoJZGl2LnF1b3RlIHsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CgkJb3ZlcmZsb3cteTogdmlzaWJsZTsKCX0KfQoKbmF2IHsKCXBhZGRpbmc6IDAgMC41ZW07CgltYXJnaW46IDA7CglmbGV4OiAxIDEgMDsKCW1pbi13aWR0aDogMzUwcHg7CgltYXgtd2lkdGg6IDM1MHB4OwoJYm94LXNoYWRvdzogMCAwIDEwcHggdmFyKC0tYm94LXNoYWRvdy1jb2xvcik7CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cn0KCm5hdiA+IGRpdiB7Cglwb3NpdGlvbjogZml4ZWQ7CgltYXgtd2lkdGg6IDM1MHB4OwoJbWF4LWhlaWdodDogMTAwJTsKCW92ZXJmbG93OiBzY3JvbGw7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcGFkZGluZzogMCAwLjVlbTsKCW1hcmdpbjogMDsKfQoKbmF2ID4gZGl2ID4gZGl2IHsKCXBhZGRpbmc6IDAuNWVtOwoJcGFkZGluZy10b3A6IDA7CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9CgphcnRpY2xlIHsKCWZsZXg6IDMgMSAwOwogIHNjcm9sbC1iZWhhdmlvcjogc21vb3RoOwoJb3ZlcmZsb3c6IHNjcm9sbDsKCWhlaWdodDogMTAwdmg7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgdHJhbnNwYXJlbnQscmdiYSh2YXIoLS1tYWluLWJhY2tncm91bmQpLDAuNiksIHJnYmEodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSwwLjgpLCByZ2JhKHZhcigtLW1haW4tYmFja2dyb3VuZCksMC42KSwgdHJhbnNwYXJlbnQpOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKYXJ0aWNsZSA+IGRpdiB7CglwYWRkaW5nLXJpZ2h0OiAxLjVlbTsKCXBhZGRpbmctbGVmdDogMS41ZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwp9Cgpjb2RlIHsKCQp9CgpkaXYucXVvdGUgewoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJcGFkZGluZzogMWVtOwoJYm9yZGVyLXJhZGl1czogMHB4IDE1cHggMTVweCAwcHg7Cglib3JkZXItbGVmdDogNXB4IHNvbGlkIHZhcigtLXF1b3RlLWxlZnQtY29sb3IpOwoJZm9udC1zdHlsZTogaXRhbGljOwoJbWFyZ2luOiAxZW07Cn0KCmNvZGU6bm90KHByZSA+IGNvZGUpIHsKCWNvbG9yOiBpbmhlcml0OwoJYmFja2dyb3VuZDogdmFyKC0tY29kZS1iYWNrZ3JvdW5kLWNvbG9yKTsKCWJvcmRlci1yYWRpdXM6IDVweDsKCXBhZGRpbmc6IDAgMC4yZW07CgltYXJnaW46IDAgMnB4OwoJb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7Cn0KCnByZSA+IGNvZGUgewoJb3V0bGluZTogbm9uZTsKCWxpbmUtaGVpZ2h0OiAxLjQ7Cgl0YWItc2l6ZTogMjsKfQoKcHJlOmhhcyhjb2RlKSB7Cgljb2xvcjogdmFyKC0tY29kZS1mb3JlZ3JvdW5kLWNvbG9yKTsKCWJhY2tncm91bmQ6IHZhcigtLWNvZGUtYmFja2dyb3VuZC1jb2xvcik7CglwYWRkaW5nOiAxZW07Cglib3JkZXItcmFkaXVzOiAxNXB4OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJei1pbmRleDogMTsKCW92ZXJmbG93LXg6IHNjcm9sbDsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCnByZTpoYXMoY29kZS5sYW5ndWFnZS1jYXJib24pOjpiZWZvcmUgewoJY29udGVudDogIkNhcmJvbiI7Cgl0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAxZW07CglyaWdodDogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtaW5mby1jb2xvcik7Cglmb250LXdlaWdodDogYm9sZDsKfQoKcCwgdWwgPiBsaSB7Cgl0ZXh0LWFsaWduOiBqdXN0aWZ5OwoJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCWh5cGhlbnM6IGF1dG87Cn0KCmFydGljbGUgdWwgPiBsaSB7CglwYWRkaW5nLWJvdHRvbTogMC4yNWVtOwp9CgpkaXYuZGVzY3JpcHRpb24gdWwgewogIHBhZGRpbmctdG9wOiAwLjVlbTsKCXBhZGRpbmctYm90dG9tOiAwLjVlbTsKfQoKYSB7Cgljb2xvcjogdmFyKC0tbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQoKYTpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItbGluay1jb2xvcik7Cgl0ZXh0LWRlY29yYXRpb24tc3R5bGU6IHNvbGlkOwp9CgphOnZpc2l0ZWQgewoJY29sb3I6IHZhcigtLXZpc2l0ZWQtbGluay1jb2xvcik7Cn0KCmE6dmlzaXRlZDpob3ZlciB7Cgljb2xvcjogdmFyKC0taG92ZXItdmlzaXRlZC1saW5rLWNvbG9yKTsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogc29saWQ7Cn0KCmgxLCBoMiwgaDMsIGg0LCBoNSB7CgltYXJnaW46IDA7CgltYXJnaW4tYm90dG9tOiAxMHB4OwoJcGFkZGluZzogMC41ZW07CglwYWRkaW5nLXRvcDogMjBweDsKCXBhZGRpbmctYm90dG9tOiAycHg7Cgl6LWluZGV4OiAyOwoJY29sb3I6IHZhcigtLWhlYWRlci1jb2xvcik7Cn0KCmFydGljbGUgaDEsIGFydGljbGUgaDIsIGFydGljbGUgaDMsIGFydGljbGUgaDQsIGFydGljbGUgaDUgewovKglwb3NpdGlvbjogc3RpY2t5OwoJcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwoJdG9wOiAwOyovCgkKfQoKaDEgewoJZm9udC13ZWlnaHQ6IDgwMDsKCWJvcmRlci1ib3R0b206IHJnYmEodmFyKC0tbGluZS1jb2xvciksIDEpIGRvdHRlZCAycHg7Cn0KCmgyIHsKCWZvbnQtd2VpZ2h0OiA4MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjc1KSBkb3R0ZWQgMnB4Owp9CgpoMywgaDQsIGg1IHsKCWZvbnQtd2VpZ2h0OiA2MDA7Cglib3JkZXItYm90dG9tOiByZ2JhKHZhcigtLWxpbmUtY29sb3IpLCAwLjMzKSBkb3R0ZWQgMnB4Owp9CgpoMSA+IGEsIGgyID4gYSwgaDMgPiBhLCBoNCA+IGEsIGg1ID4gYSB7Cgljb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OwoJdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0Owp9CgpoMTp0YXJnZXQ6OmFmdGVyLCBoMjp0YXJnZXQ6OmFmdGVyLCBoMzp0YXJnZXQ6OmFmdGVyLCBoNDp0YXJnZXQ6OmFmdGVyLCBoNTp0YXJnZXQ6OmFmdGVyIHsKCXRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKCWNvbnRlbnQ6ICIg4pqT77iOIjsKICBmb250LXNpemU6IDE0cHg7Cn0KCmgxID4gYTpob3ZlciwgaDIgPiBhOmhvdmVyLCBoMyA+IGE6aG92ZXIsIGg0ID4gYTpob3ZlciwgaDUgPiBhOmhvdmVyIHsKCWNvbG9yOiB2YXIoLS1ob3Zlci1saW5rLWNvbG9yKTsKfQoKZGl2Omhhcyg+IGlucHV0W3R5cGU9c2VhcmNoXSkgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJcmlnaHQ6IDA7Cgl6LWluZGV4OiAxMDAwOwoJcGFkZGluZzogMC41ZW07CgliYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1uYXYtYmFja2dyb3VuZC1jb2xvcik7Cglib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsMCwwLDAuMyk7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAxMHB4Owp9CgpkaXYgPiBpbnB1dFt0eXBlPXNlYXJjaF0gewoJYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbmF2LWJhY2tncm91bmQtY29sb3IpOwoJYm9yZGVyOiAycHggc29saWQgdmFyKC0tdGV4dC1jb2xvcik7Cgljb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7Cgl3aWR0aDogMzAwcHg7Cn0KCmRpdi5wYXBlci1pbmZvIHsKCXBhZGRpbmc6IDA7CglwYWRkaW5nLXRvcDogMWVtOwoJCgkua2V5IHsKCQlmb250LXdlaWdodDogYm9sZDsKCX0KCQoJZGl2IHsKCX0KfQoKdWwgewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCXBhZGRpbmctbGVmdDogMmVtOwp9CgpsaSA+IHVsIHsKCXBhZGRpbmctbGVmdDogMC41ZW07Cn0KCnVsID4gbGkgewoJcGFkZGluZy1sZWZ0OiAwLjVlbTsKfQoKY29kZSAuZXJyb3IsIGNvZGUgLmJlZm9yZSB7CgkJbGluZS1oZWlnaHQ6IDEuOTsKfQoKY29kZSAuZXJyb3IgPiAqLCBjb2RlIC5iZWZvcmUgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6ICNGRjg4ODggIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkICNGRjg4ODg7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuYWZ0ZXIgPiAqIHsKCWJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW4gIWltcG9ydGFudDsKCWNvbG9yOiBibGFjayAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiB3aGl0ZTsKCX0KCWJvcmRlcjogM3B4IHNvbGlkIGxpZ2h0Z3JlZW47Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAudW5jaGFuZ2VkID4gKiB7CgliYWNrZ3JvdW5kLWNvbG9yOiBsaWdodHllbGxvdyAhaW1wb3J0YW50OwoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IHdoaXRlOwoJfQoJYm9yZGVyOiAzcHggc29saWQgbGlnaHR5ZWxsb3c7Cglmb250LXdlaWdodDogYm9sZDsKfQoKY29kZSAuaW52aXNpYmxlIHsKCXZpc2liaWxpdHk6IGhpZGRlbjsKfQoKLmNoYW5nZXMgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Cgoud29yZGluZyBoMSwgLndvcmRpbmcgaDIgewoJZm9udC1zaXplOiBpbmhlcml0OwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwoJYm9yZGVyOiBub25lOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKfQoKLndvcmRpbmcgcCB7CglwYWRkaW5nOiAwOwoJcGFkZGluZy10b3A6IDAuNWVtOwoJbWFyZ2luOiAwOwp9Cgoud29yZGluZyBhIHsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWNvbG9yOiBpbmhlcml0Owp9Cgoud29yZGluZyBhOmhvdmVyIHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJY29sb3I6IHZhcigtLWxpbmstY29sb3IpOwp9Cgoud29yZGluZyBjb2RlIHsKCWJhY2tncm91bmQ6IGluaGVyaXQgIWltcG9ydGFudDsKCWJvcmRlcjogbm9uZTsKCW91dGxpbmU6IG5vbmU7Cn0KCQoud29yZGluZyB7Cglmb250LWZhbWlseTogIk5vdG8gU2VyaWYiOwoJCglwYWRkaW5nOiAwLjVlbSAxZW07CglwYWRkaW5nLWJvdHRvbTogMWVtOwoJY29sb3I6IHZhcigtLWNvZGUtZm9yZWdyb3VuZC1jb2xvcik7CgliYWNrZ3JvdW5kOiB2YXIoLS1jb2RlLWJhY2tncm91bmQtY29sb3IpOwoJbGluZS1oZWlnaHQ6IDEuNTU7CgkKCWJvcmRlci1yYWRpdXM6IDE1cHg7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl6LWluZGV4OiAxOwoJb3ZlcmZsb3cteDogdmlzaWJsZTsKCW92ZXJmbG93LXk6IHZpc2libGU7Cn0KCQoud29yZGluZyAuYWRkZWQsIHByZSAuYWRkZWQgewoJYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmVlbjsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tY29sb3I6IGdyZWVuOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJei1pbmRleDogODA7CglwYWRkaW5nOiAzcHg7CglAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CgkJY29sb3I6IGJsYWNrOwoJfQp9CgkKLndvcmRpbmcgLnJlbW92ZWQgewoJYmFja2dyb3VuZC1jb2xvcjogI0ZGODg4ODsKCXotaW5kZXg6IDUwOwoJcGFkZGluZzogM3B4OwogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwogIHRleHQtZGVjb3JhdGlvbi1jb2xvcjogcmVkOwogIHRleHQtZGVjb3JhdGlvbi10aGlja25lc3M6IDJweCAhaW1wb3J0YW50OwoJQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoJCWNvbG9yOiBibGFjazsKCX0KfQoJCi53b3JkaW5nIC5ub3RlIHsKCWZvbnQtc2l6ZTogMC44ZW07Cn0KCQoud29yZGluZwkrIC53b3JkaW5nIHsKCW1hcmdpbi10b3A6IDAuNWVtOwp9CgkKLndvcmRpbmcgcHJlOmhhcyhjb2RlKSB7Cglib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2RlLWluZm8tY29sb3IpOwoJYm9yZGVyLXJhZGl1czogMDsKCXBhZGRpbmc6IDBlbTsKCXotaW5kZXg6IDE7CglvdmVyZmxvdy14OiBzY3JvbGw7Cn0KCQoud29yZGluZwljb2RlIC5hZGRlZGVkIHNwYW4gewoJY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7Cn0KCnRhYmxlLnBvbGwgewogIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKdGFibGUucG9sbCB0aCwgdGFibGUucG9sbCB0ZCB7CiAgYm9yZGVyOiAwOwogIHBhZGRpbmc6IDAgMTBweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgYm9yZGVyOiAycHggc29saWQgcmdiYSgxMjgsMTI4LDEyOCwwLjIpOwp9Cgp0YWJsZS5wb2xsIHRkOmZpcnN0LWNoaWxkLCB0YWJsZS5wb2xsIHRoOmZpcnN0LWNoaWxkIHsKIGJvcmRlci1sZWZ0OiBub25lOwp9Cgp0YWJsZS5wb2xsIHRkOmxhc3QtY2hpbGQsIHRhYmxlLnBvbGwgdGg6bGFzdC1jaGlsZCB7CiBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdHI6Zmlyc3QtY2hpbGQgdGgsIHRhYmxlLnBvbGwgdHI6Zmlyc3QtY2hpbGQgdGQgewogIGJvcmRlci10b3A6IG5vbmU7Cn0KCnRhYmxlLnBvbGwgdHI6bGFzdC1jaGlsZCB0aCwgdGFibGUucG9sbCB0cjpsYXN0LWNoaWxkIHRkIHsKICBib3JkZXItYm90dG9tOiBub25lOwp9Cgoud29yZGluZyAuZGVzY3JpcHRpb24gewogIHBhZGRpbmctYm90dG9tOiAxZW07Cn0KCi53b3JkaW5nIC5jYXBzIHsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCB7CgltYXgtd2lkdGg6IDJlbTsKfQoKdGFibGUgdGgudGFibGUtZ3JvdXAgPiBzcGFuIHsKCW1heC13aWR0aDogMmVtOwoJZGlzcGxheTogYmxvY2s7CglvdmVyZmxvdzogdmlzaWJsZTsKCXRleHQtYWxpZ246IGNlbnRlcjsKCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgxZW0pOwp9Cgp0YWJsZSB0aC50YWJsZS1ncm91cCA+IHNwYW4gPiBzcGFuIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKSByb3RhdGUoLTkwZGVnKTsKCXdpZHRoOiBhdXRvOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgdGgsIHRhYmxlLmJlZm9yZS1hZnRlciB0ZCAgewogIGhlaWdodDogMzBweDsKfQoKCgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLmdyZWVuIHsKICBjb2xvcjogZ3JlZW47Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAub3JhbmdlIHsKICBjb2xvcjogb3JhbmdlOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnJlZC1ub3JtYWwgewogIGNvbG9yOiByZWQ7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAuaW4tcHJvZ3Jlc3MgewoJY29sb3I6IGJsdWU7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMjMxLDI1NSwwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnByb3Bvc2luZyB7Cgljb2xvcjogZ3JlZW47CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsMjU1LDAsMC41KTsKfQoKdGFibGUuYmVmb3JlLWFmdGVyIC5ub3QtcHJvcG9zaW5nIHsKCWNvbG9yOiByZWQ7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwwLDAsMC4yNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAubmV2ZXItcHJvcG9zaW5nIHsKCWNvbG9yOiByZWQ7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwwLDAsMC4yNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucHJvcG9zZWQtcmVhZHktZm9yLWZ1dHVyZSB7Cgljb2xvcjogZ3JlZW47CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIwMywyMjksNywwLjUpOwp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgLnByb3Bvc2VkLXJlYWR5LWZvci1mdXR1cmUyIHsKCWNvbG9yOiBncmVlbjsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LDE5OCwwLDAuNSk7Cn0KCnRhYmxlLmJlZm9yZS1hZnRlciAucmVkIHsKICBjb2xvcjogcmVkOwogIGZvbnQtc2l6ZTogMjRweDsKICBsaW5lLWhlaWdodDogMTZweDsKfQoKdGQgYSwgdGQgYTp2aXNpdGVkLCB0ZCBhOmhvdmVyIHsKCWNvbG9yOiBpbmhlcml0Owp9CgpkaXYud29yZGluZy1ub3RlIHsKICBiYWNrZ3JvdW5kOiByZ2IodmFyKC0tbWFpbi1iYWNrZ3JvdW5kKSk7CiAgYm94LXNoYWRvdzogNXB4IDAgMTBweCB2YXIoLS10aGluLWJveC1zaGFkb3ctY29sb3IpIGluc2V0OwogIGJvcmRlci1yYWRpdXM6IDE1cHg7CiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpOwogIHBhZGRpbmc6IDEwcHg7CiAgbWFyZ2luOiAxMHB4IDIwcHg7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGFybnVtIHsKCWZvbnQtc2l6ZTogMTJweDsKCW1hcmdpbi1yaWdodDogMC4yNWVtOwoJZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgpsaTpoYXMoPiAucGFybnVtKSB7CglsaXN0LXN0eWxlLXBvc2l0aW9uOiBpbnNpZGU7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCmxpID4gLnBhcm51bSB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAtMzBweDsKCWJvdHRvbTogMnB4Owp9Cgp0YWJsZS5iZWZvcmUtYWZ0ZXIgdGQuZGlzYWJsZS1ib3R0b20sIHRhYmxlLmJlZm9yZS1hZnRlciB0aC5kaXNhYmxlLWJvdHRvbSB7Cglib3JkZXItYm90dG9tOiBub25lOwp9CnRhYmxlLmJlZm9yZS1hZnRlciB0aC5sZWZ0LCB0YWJsZS5iZWZvcmUtYWZ0ZXIgdGQubGVmdCB7Cgl0ZXh0LWFsaWduOiBsZWZ0Owp9Cgp0ZCBhLm5vdGU6YWZ0ZXIgewoJdmVydGljYWwtYWxpZ246IHN1cGVyOwoJZm9udC1zaXplOiA3NSU7CgltYXJnaW4tbGVmdDogMC41ZW07Cn0KCnRkIGEubm90ZS5uMTphZnRlciB7Cgljb250ZW50OiAiMSI7Cn0KCnRkIGEubm90ZS5uMjphZnRlciB7Cgljb250ZW50OiAiMiI7Cn0KCnRkIGEubm90ZS5uMzphZnRlciB7Cgljb250ZW50OiAiMyI7Cn0KCnRkIGEubm90ZS5uNDphZnRlciB7Cgljb250ZW50OiAiNCI7Cn0KCnRkIGEubm90ZS5uNTphZnRlciB7Cgljb250ZW50OiAiNSI7Cn0=">
<link rel="stylesheet" href="data:text/css;base64,QG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKCnByZSBjb2RlLmhsanMgewoKfQpjb2RlLmhsanMgewoKfQovKgoKWENvZGUgc3R5bGUgKGMpIEFuZ2VsIEdhcmNpYSA8YW5nZWxnYXJjaWEubWFpbEBnbWFpbC5jb20+CgoqLwouaGxqcyB7CiAgY29sb3I6IGluaGVyaXQKfQovKiBHcmF5IERPQ1RZUEUgc2VsZWN0b3JzIGxpa2UgV2ViS2l0ICovCi54bWwgLmhsanMtbWV0YSB7CiAgY29sb3I6ICNjMGMwYzAKfQouaGxqcy1jb21tZW50LAouaGxqcy1xdW90ZSB7CiAgY29sb3I6ICMwMDc0MDAKfQouaGxqcy10YWcsCi5obGpzLWF0dHJpYnV0ZSwKLmhsanMta2V5d29yZCwKLmhsanMtc2VsZWN0b3ItdGFnLAouaGxqcy1saXRlcmFsLAouaGxqcy1uYW1lIHsKICBjb2xvcjogI2FhMGQ5MQp9Ci5obGpzLXZhcmlhYmxlLAouaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSB7CiAgY29sb3I6ICMzRjZFNzQKfQouaGxqcy1jb2RlLAouaGxqcy1zdHJpbmcsCi5obGpzLW1ldGEgLmhsanMtc3RyaW5nIHsKICBjb2xvcjogI2M0MWExNgp9Ci5obGpzLXJlZ2V4cCwKLmhsanMtbGluayB7CiAgY29sb3I6ICMwRTBFRkYKfQouaGxqcy10aXRsZSwKLmhsanMtc3ltYm9sLAouaGxqcy1idWxsZXQsCi5obGpzLW51bWJlciB7CiAgY29sb3I6ICMxYzAwY2YKfQouaGxqcy1zZWN0aW9uLAouaGxqcy1tZXRhIHsKICBjb2xvcjogIzY0MzgyMAp9Ci5obGpzLXRpdGxlLmNsYXNzXywKLmhsanMtY2xhc3MgLmhsanMtdGl0bGUsCi5obGpzLXR5cGUsCi5obGpzLWJ1aWx0X2luLAouaGxqcy1wYXJhbXMgewogIGNvbG9yOiAjNWMyNjk5Cn0KLmhsanMtYXR0ciB7CiAgY29sb3I6ICM4MzZDMjgKfQouaGxqcy1zdWJzdCB7CiAgY29sb3I6ICMwMDAKfQouaGxqcy1mb3JtdWxhIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQouaGxqcy1hZGRpdGlvbiB7Cgp9Ci5obGpzLWRlbGV0aW9uIHsKCn0KLmhsanMtc2VsZWN0b3ItaWQsCi5obGpzLXNlbGVjdG9yLWNsYXNzIHsKICBjb2xvcjogIzliNzAzZgp9Ci5obGpzLWRvY3RhZywKLmhsanMtc3Ryb25nIHsKICBmb250LXdlaWdodDogYm9sZAp9Ci5obGpzLWVtcGhhc2lzIHsKICBmb250LXN0eWxlOiBpdGFsaWMKfQoKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykgewoKcHJlIGNvZGUuaGxqcyB7Cgp9CmNvZGUuaGxqcyB7Cgp9Ci8qCgpYQ29kZSBzdHlsZSAoYykgQW5nZWwgR2FyY2lhIDxhbmdlbGdhcmNpYS5tYWlsQGdtYWlsLmNvbT4KCiovCi5obGpzIHsKICBjb2xvcjogaW5oZXJpdAp9Ci8qIEdyYXkgRE9DVFlQRSBzZWxlY3RvcnMgbGlrZSBXZWJLaXQgKi8KLnhtbCAuaGxqcy1tZXRhIHsKICBjb2xvcjogI2MwYzBjMAp9Ci5obGpzLWNvbW1lbnQsCi5obGpzLXF1b3RlIHsKICBjb2xvcjogIzAwNzQwMAp9Ci5obGpzLXRhZywKLmhsanMtYXR0cmlidXRlLAouaGxqcy1rZXl3b3JkLAouaGxqcy1zZWxlY3Rvci10YWcsCi5obGpzLWxpdGVyYWwsCi5obGpzLW5hbWUgewogIGNvbG9yOiAjYWEwZDkxCn0KLmhsanMtdmFyaWFibGUsCi5obGpzLXRlbXBsYXRlLXZhcmlhYmxlIHsKICBjb2xvcjogIzNGNkU3NAp9Ci5obGpzLWNvZGUsCi5obGpzLXN0cmluZywKLmhsanMtbWV0YSAuaGxqcy1zdHJpbmcgewogIGNvbG9yOiAjYzQxYTE2Cn0KLmhsanMtcmVnZXhwLAouaGxqcy1saW5rIHsKICBjb2xvcjogIzBFMEVGRgp9Ci5obGpzLXRpdGxlLAouaGxqcy1zeW1ib2wsCi5obGpzLWJ1bGxldCwKLmhsanMtbnVtYmVyIHsKICBjb2xvcjogIzkzODJmZgp9Ci5obGpzLXNlY3Rpb24sCi5obGpzLW1ldGEgewogIGNvbG9yOiAjNjQzODIwCn0KLmhsanMtdGl0bGUuY2xhc3NfLAouaGxqcy1jbGFzcyAuaGxqcy10aXRsZSwKLmhsanMtdHlwZSwKLmhsanMtYnVpbHRfaW4sCi5obGpzLXBhcmFtcyB7CiAgY29sb3I6ICNiODc5ZmYKfQouaGxqcy1hdHRyIHsKICBjb2xvcjogIzgzNkMyOAp9Ci5obGpzLXN1YnN0IHsKICBjb2xvcjogIzAwMAp9Ci5obGpzLWZvcm11bGEgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Ci5obGpzLWFkZGl0aW9uIHsKCn0KLmhsanMtZGVsZXRpb24gewoKfQouaGxqcy1zZWxlY3Rvci1pZCwKLmhsanMtc2VsZWN0b3ItY2xhc3MgewogIGNvbG9yOiAjOWI3MDNmCn0KLmhsanMtZG9jdGFnLAouaGxqcy1zdHJvbmcgewogIGZvbnQtd2VpZ2h0OiBib2xkCn0KLmhsanMtZW1waGFzaXMgewogIGZvbnQtc3R5bGU6IGl0YWxpYwp9Cgp9CgoK">
<link rel="stylesheet" href="data:text/css;base64,LndvcmRpbmcgIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBoeXBoZW5zOiBhdXRvOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHBhZGRpbmctbGVmdDogM2VtOwp9Cgoud29yZGluZyBkaXYgewogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKfQoKLndvcmRpbmcgZGl2LndyYXBwZXIgewogICAgbWF4LXdpZHRoOiAyMGNtOwogICAgbWFyZ2luOiBhdXRvOwp9Cgoud29yZGluZyBkaXYudGV4cGFyYSB7CiAgICBtYXJnaW4tdG9wOiAzcHQ7CiAgICBtYXJnaW4tYm90dG9tOiAzcHQ7Cn0KCi53b3JkaW5nIHRhYmxlIGRpdi50ZXhwYXJhIHsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgZGl2LnRleHBhcmEgewogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0Owp9Cgoud29yZGluZyB1bCB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBwYWRkaW5nLWxlZnQ6IDltbTsKICAgIG1hcmdpbi10b3A6IDA7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9Cgoud29yZGluZyBvbCB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMDsKfQoKLndvcmRpbmcgYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi53b3JkaW5nIGEuaGlkZGVuX2xpbmsgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgY29sb3I6IGluaGVyaXQ7Cn0KCi53b3JkaW5nIGxpIHsKICAgIG1hcmdpbi10b3A6IDNwdDsKICAgIG1hcmdpbi1ib3R0b206IDNwdDsKfQoKLndvcmRpbmcgaDEgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDIgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBmb250LXNpemU6IDE0cHQ7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDI6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDMgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDM6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgaDQgewogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW4tdG9wOiAxMHB0OwogICAgbWFyZ2luLWJvdHRvbTogMTBwdDsKfQoKLndvcmRpbmcgaDQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIiOwogICAgY2xlYXI6IGJvdGg7CiAgICBkaXNwbGF5OiB0YWJsZTsKfQoKLndvcmRpbmcgdWwgPiBsaTpiZWZvcmUgewogICAgY29udGVudDogIlwyMDE0IjsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIG1hcmdpbi1sZWZ0OiAtMS41ZW07Cn0KCi53b3JkaW5nIC5zaHk6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcMDBhZCI7CiAgICAvKiBUaGlzIGlzIFUrMDBBRCBTT0ZUIEhZUEhFTiwgc2FtZSBhcyAmc2h5LCBidXQgd2UgcHV0IGl0IGluIDpiZWZvcmUKICAgIAl0byBzdG9wIGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgd2hlbiB0aGUgdGV4dCBpcyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZAogICAgCXdpdGggRmlyZWZveCwgd2hpY2ggaXMgZXNwZWNpYWxseSBhbm5veWluZyB3aGVuIGNvcHlpbmcgdG8gYSB0ZXJtaW5hbCwKICAgIAl3aGVyZSB0aGUgaHlwaGVuIGNoYXJhY3RlcnMgd2lsbCBzaG93IHVwLiAqLwp9CgoKLndvcmRpbmcgLmFiYnJfcmVmIHsKICAgIGZsb2F0OiByaWdodDsKfQoKLndvcmRpbmcgLmZvbGRlZF9hYmJyX3JlZiB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIC51bmZvbGRlZF9hYmJyX3JlZiB7CiAgICBkaXNwbGF5OiBub25lOwp9Cgoud29yZGluZyAuc2VjbnVtIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIG1pbi13aWR0aDogMzVwdDsKfQoKLndvcmRpbmcgLmFubmV4bnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyBkaXYuc291cmNlTGlua1BhcmVudCB7CiAgICBmbG9hdDogcmlnaHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBvcGFjaXR5OiAwOwogICAgbWFyZ2luLWxlZnQ6IDEwcHQ7Cn0KCi53b3JkaW5nIGEuc291cmNlTGluazpob3ZlciB7CiAgICBvcGFjaXR5OiAxOwp9Cgoud29yZGluZyBhLml0ZW1EZWNsTGluayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICBmb250LXNpemU6IDc1JTsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgd2lkdGg6IDVlbTsKICAgIG9wYWNpdHk6IDA7Cn0KCi53b3JkaW5nIGEuaXRlbURlY2xMaW5rOmhvdmVyIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi53b3JkaW5nIGRpdi5tYXJnaW5hbGl6ZWRwYXJlbnQgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgbGVmdDogLTE4bW07Cn0KCi53b3JkaW5nIGEubWFyZ2luYWxpemVkIHsKICAgIHdpZHRoOiAxNW1tOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgZm9udC1zaXplOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgYS5lbnVtZXJhdGVkX2l0ZW1fbnVtIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwogICAgbWFyZ2luLXJpZ2h0OiA2cHQ7Cn0KCi53b3JkaW5nIGRpdi5wYXJhIHsKICAgIG1hcmdpbi1ib3R0b206IDZwdDsKICAgIG1hcmdpbi10b3A6IDZwdDsKICAgIHRleHQtYWxpZ246IGp1c3RpZnk7CiAgICBtaW4taGVpZ2h0OiAxLjJlbTsKfQoKLndvcmRpbmcgZGl2LnNlY3Rpb24gewogICAgdGV4dC1hbGlnbjoganVzdGlmeTsKfQoKLndvcmRpbmcgZGl2LnNlbnRlbmNlIHsKICAgIGRpc3BsYXk6IGlubGluZTsKfQoKLndvcmRpbmcgYS5pbmRleCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBmbG9hdDogcmlnaHQ7CiAgICByaWdodDogLTFlbTsKICAgIGRpc3BsYXk6IG5vbmU7Cn0KCi53b3JkaW5nIGEuaW5kZXg6YmVmb3JlIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGNvbnRlbnQ6ICLin7UiOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0M5RkJDOTsKfQoKCi53b3JkaW5nIC5pbmRleGl0ZW1zIHsKICAgIG1hcmdpbi1sZWZ0OiAyZW07CiAgICB0ZXh0LWluZGVudDogLTJlbTsKfQoKLndvcmRpbmcgZGl2Lml0ZW1kZXNjciB7CiAgICBtYXJnaW4tbGVmdDogMTJtbTsKfQoKLndvcmRpbmcgLmJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBtYXJnaW4tbGVmdDogMjVwdDsKICAgIG1hcmdpbi1yaWdodDogLTE1bW07CiAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIGRpdi5ibmYgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIC5yZWJuZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgbWFyZ2luLXRvcDogMC41ZW07CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgIG1hcmdpbi1sZWZ0OiAzMHB0OwogICAgdGV4dC1pbmRlbnQ6IC0zZW07CiAgICBwYWRkaW5nLWxlZnQ6IDNlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIC5zaW1wbGVibmYgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgICBtYXJnaW4tbGVmdDogMzBwdDsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi53b3JkaW5nIHNwYW4udGV4dG5vcm1hbCB7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0OwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKfQoKLndvcmRpbmcgLmJuZiBzcGFuLnRleHRub3JtYWwgewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHAgewogICAgbWFyZ2luLXRvcDogNHB0OwogICAgbWFyZ2luLWJvdHRvbTogNHB0Owp9Cgoud29yZGluZyBzcGFuLnJsYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDBweDsKICAgIHRleHQtaW5kZW50OiAwOwp9Cgoud29yZGluZyBzcGFuLnRlcm1pbmFsIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1zaXplOiA5cHQ7CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Cn0KCi53b3JkaW5nIHNwYW4ubm9uY3h4dGVybWluYWwgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXJtIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi50Y29kZSB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0YmYgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuYm5mIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgLnNpbXBsZWJuZiBzcGFuLnRleHRzZiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5leGFtcGxlIHNwYW4udGV4dHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2MgewogICAgZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwp9Cgoud29yZGluZyBzcGFuLm5vbnRlcm1kZWYgewogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAucmVibmYgYS5ub250ZXJtZGVmIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7Cn0KCi53b3JkaW5nIHNwYW4uZW1waCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4udGVjaHRlcm0gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGhpdCB7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aHNmIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zJzsKfQoKLndvcmRpbmcgc3Bhbi5tYXRocm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0cm0gewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c2wgewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9Cgoud29yZGluZyBzcGFuLm1hdGh0dCB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLndvcmRpbmcgc3Bhbi5tYm94IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4udW5nYXAgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2lkdGg6IDJwdDsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0dHQgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7Cn0KCi53b3JkaW5nIHNwYW4udGV4dGl0IHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgZGl2LmZvb3Rub3RlIHNwYW4udGV4dHR0IHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwp9Cgoud29yZGluZyBzcGFuLnRjb2RlX2luX2NvZGVibG9jayB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBzcGFuLnBoYW50b20gewogICAgY29sb3I6IHdoaXRlOwp9Ci8qIFVuZm9ydHVuYXRlbHksIHRoaXMgd2F5IHRoZSB0ZXh0IGlzIHN0aWxsIHNlbGVjdGFibGUuIEFub3RoZXIKCW9wdGlvbiBpcyBkaXNwbGF5Om5vbmUsIGJ1dCB0aGVuIHdlIGxvc2UgdGhlIG5pY2UgbGF5b3V0LgoJVG9kbzogZmluZCBwcm9wZXIgc29sdXRpb24uICovCgoud29yZGluZyBzcGFuLm1hdGggewogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogMTBwdDsKfQoKLndvcmRpbmcgc3Bhbi5tYXRoYmxvY2sgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIG1hcmdpbi1yaWdodDogYXV0bzsKICAgIG1hcmdpbi10b3A6IDEuMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMS4yZW07CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCi53b3JkaW5nIHNwYW4ubWF0aGFscGhhIHsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKfQoKLndvcmRpbmcgc3Bhbi5zeW5vcHNpcyB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgZGlzcGxheTogYmxvY2s7Cn0KCi53b3JkaW5nIHNwYW4uZGVmaW5pdGlvbiB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGRpc3BsYXk6IGJsb2NrOwp9Cgoud29yZGluZyAuY29kZWJsb2NrIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgbWFyZ2luLWxlZnQ6IDEuMmVtOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIGZvbnQtc2l6ZTogOXB0OwogICAgd2hpdGUtc3BhY2U6IHByZTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWFyZ2luLXRvcDogM3B0OwogICAgbWFyZ2luLWJvdHRvbTogM3B0OwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyB0YWJsZSAuY29kZWJsb2NrIHsKICAgIG1hcmdpbi1yaWdodDogMDsKfQoKLndvcmRpbmcgLm91dHB1dGJsb2NrIHsKICAgIG1hcmdpbi1sZWZ0OiAxLjJlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2FucyBNb25vJzsKICAgIGZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBjb2RlIHsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTYW5zIE1vbm8nOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBkaXYuaXRlbWRlY2wgewogICAgbWFyZ2luLXRvcDogMmV4Owp9Cgoud29yZGluZyBjb2RlLml0ZW1kZWNsY29kZSB7CiAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDlwdDsKICAgIGRpc3BsYXk6IGJsb2NrOwoJCW92ZXJmbG93LXg6IHNjcm9sbDsKICAgIG92ZXJmbG93LXk6IHZpc2libGU7CiAgICBtYXJnaW4tcmlnaHQ6IC0xNW1tOwp9Cgoud29yZGluZyAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiAxMHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLmNvbW1lbnQgewogICAgY29sb3I6IGdyZWVuOwogICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNlcmlmJzsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZXhhbXBsZSAuY29tbWVudCB7CiAgICBjb2xvcjogZ3JlZW47CiAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2VyaWYnOwogICAgZm9udC1zaXplOiA5cHQ7Cn0KCi53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgIGNvbG9yOiBncmVlbjsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtZmFtaWx5OiAnTm90byBTZXJpZic7CiAgICBmb250LXNpemU6IDlwdDsKfQoKLndvcmRpbmcgc3Bhbi5rZXl3b3JkIHsKICAgIGNvbG9yOiAjMDA2MDdjOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwp9Cgoud29yZGluZyBzcGFuLnBhcmVudGhlc2lzIHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmN1cmx5YnJhY2tldCB7CiAgICBjb2xvcjogI2FmMTkxNTsKfQoKLndvcmRpbmcgc3Bhbi5zcXVhcmVicmFja2V0IHsKICAgIGNvbG9yOiAjYWYxOTE1Owp9Cgoud29yZGluZyBzcGFuLmxpdGVyYWwgewogICAgY29sb3I6ICM5RjY4MDc7Cn0KCi53b3JkaW5nIHNwYW4ubGl0ZXJhbHRlcm1pbmFsIHsKICAgIGNvbG9yOiAjOUY2ODA3OwogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgY29sb3I6ICM1NzAwNTc7Cn0KCi53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgIGNvbG9yOiAjNTcwMDU3Owp9Cgoud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICBjb2xvcjogIzZGNEUzNzsKfQoKLndvcmRpbmcgc3Bhbi50ZXh0c3VwZXJzY3JpcHQgewogICAgdmVydGljYWwtYWxpZ246IHN1cGVyOwogICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgbGluZS1oZWlnaHQ6IDA7Cn0KCi53b3JkaW5nIC5mb290bm90ZXJlZiB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogc3VwZXI7CiAgICBmb250LXNpemU6IHNtYWxsZXI7CiAgICBsaW5lLWhlaWdodDogMDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlIHsKICAgIGZvbnQtc2l6ZTogOHB0Owp9Cgoud29yZGluZyAuZm9vdG5vdGUgLm1hdGggewogICAgZm9udC1zaXplOiA4cHQ7Cn0KCi53b3JkaW5nIC5mb290bm90ZW51bSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIG1hcmdpbi1yaWdodDogMW1tOwogICAgd2lkdGg6IDRjaDsKfQoKLndvcmRpbmcgLmZvb3Rub3RlQmFja2xpbmsgewogICAgZGlzcGxheTogbm9uZTsKfQoKLndvcmRpbmcgLmZvb3Rub3RlU2VwYXJhdG9yIHsKICAgIGJhY2tncm91bmQ6IGJsYWNrOwogICAgbWFyZ2luLXRvcDogNW1tOwogICAgaGVpZ2h0OiAxcHg7CiAgICB3aWR0aDogNmNtOwp9Cgoud29yZGluZyBkaXYubWluaXBhZ2UgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgbWFyZ2luLXJpZ2h0OiAzZW07Cn0KCi53b3JkaW5nIGRpdi5udW1iZXJlZFRhYmxlIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG1hcmdpbi1sZWZ0OiAxZW07CiAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgIG1hcmdpbi1ib3R0b206IDEycHQ7CiAgICBtYXJnaW4tdG9wOiA4cHQ7Cn0KCi53b3JkaW5nIGRpdi5maWd1cmUgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgIG1hcmdpbi1yaWdodDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMTJwdDsKICAgIG1hcmdpbi10b3A6IDNwdDsKfQoKLndvcmRpbmcgdGFibGUgewogICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87CiAgICBtYXJnaW4tdG9wOiA3cHQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZCwgLndvcmRpbmcgdGggewogICAgcGFkZGluZy1sZWZ0OiA4cHQ7CiAgICBwYWRkaW5nLXJpZ2h0OiA4cHQ7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Cgoud29yZGluZyB0ZC5lbXB0eSB7CiAgICBwYWRkaW5nOiAwcHg7CiAgICBwYWRkaW5nLWxlZnQ6IDFweDsKfQoKLndvcmRpbmcgdGQubGVmdCB7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgoud29yZGluZyB0ZC5oaWRkZW4gewogICAgcGFkZGluZzogMDsKICAgIHdpZHRoOiAwOwp9Cgoud29yZGluZyB0ZC5yaWdodCB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKfQoKLndvcmRpbmcgdGQuY2VudGVyIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLndvcmRpbmcgdGQuanVzdGlmeSB7CiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Owp9Cgoud29yZGluZyB0ZC5ib3JkZXIgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgdHIucm93c2VwLCAud29yZGluZyB0ZC5jbGluZSB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Cn0KCi53b3JkaW5nIHRyLmNhcHNlcCB7CiAgICBib3JkZXItdG9wOiAzcHggc29saWQgYmxhY2s7CiAgICBib3JkZXItdG9wLXN0eWxlOiBkb3VibGU7Cn0KCi53b3JkaW5nIHRoIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKfQoKLndvcmRpbmcgc3Bhbi5jZW50cnkgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi53b3JkaW5nIGRpdi50YWJsZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgd2lkdGg6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi5pbmRlbnRlZCB7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgZGlzcGxheTogYmxvY2s7CiAgICBtYXJnaW4tbGVmdDogMmVtOwogICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgbWFyZ2luLXRvcDogMWVtOwp9Cgoud29yZGluZyBzcGFuLnVwcGVyY2FzZSB7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cgoud29yZGluZyBzcGFuLnVjb2RlIHsKICAgIGZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICBmb250LXNpemU6IDkwJTsKfQoKLndvcmRpbmcgc3Bhbi51bmFtZSB7CiAgICBmb250LXZhcmlhbnQ6IHNtYWxsLWNhcHM7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgZm9udC1zaXplOiA5MCU7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB7CiAgICBib3JkZXI6IDA7CiAgICBtYXJnaW46IDA7Cn0KCi53b3JkaW5nIHRhYmxlLmVudW1lcmF0ZSB0ZCB7CiAgICBwYWRkaW5nOiAwOwp9Cgoud29yZGluZyB0YWJsZS5lbnVtZXJhdGUgdGQ6Zmlyc3QtY2hpbGQgewogICAgd2lkdGg6IDFjbTsKICAgIHRleHQtYWxpZ246IHJpZ2h0Owp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSB7CiAgICAud29yZGluZyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzE3MTcxNzsKICAgICAgICBjb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLm1qeC1tc3R5bGUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwICFpbXBvcnRhbnQKICAgIH0KCiAgICAud29yZGluZyBhOmxpbmsgewogICAgICAgIGNvbG9yOiAjNjRhZGZmOwogICAgfQoKICAgIC53b3JkaW5nIGE6dmlzaXRlZCB7CiAgICAgICAgY29sb3I6ICNhMzZhZTY7CiAgICB9CgogICAgLndvcmRpbmcgYS5oaWRkZW5fbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGhhbnRvbSB7CiAgICAgICAgY29sb3I6ICMxNzE3MTc7CiAgICB9CgogICAgLndvcmRpbmcgYS5pbmRleDpiZWZvcmUgewogICAgICAgIGNvbG9yOiAjZDBkMGQwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM0YjYzNTM7CiAgICB9CgogICAgLndvcmRpbmcgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZSAuY29tbWVudCB7CiAgICAgICAgY29sb3I6ICMzNWRhMDA7CiAgICB9CgogICAgLndvcmRpbmcgLmV4YW1wbGUgLmNvbW1lbnQgewogICAgICAgIGNvbG9yOiAjMzVkYTAwOwogICAgfQoKICAgIC53b3JkaW5nIC5ub3RlIC5jb21tZW50IHsKICAgICAgICBjb2xvcjogIzM1ZGEwMDsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLmtleXdvcmQgewogICAgICAgIGNvbG9yOiAjMTJjYWJlOwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ucGFyZW50aGVzaXMgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uY3VybHlicmFja2V0IHsKICAgICAgICBjb2xvcjogI2ZmMTUxNTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnNxdWFyZWJyYWNrZXQgewogICAgICAgIGNvbG9yOiAjZmYxNTE1OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ubGl0ZXJhbCB7CiAgICAgICAgY29sb3I6ICNkZmE4Mzc7CiAgICB9CgogICAgLndvcmRpbmcgc3Bhbi5saXRlcmFsdGVybWluYWwgewogICAgICAgIGNvbG9yOiAjZGZhODM3OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4ub3BlcmF0b3IgewogICAgICAgIGNvbG9yOiAjYmFhNmI5OwogICAgfQoKICAgIC53b3JkaW5nIHNwYW4uYW5nbGVicmFja2V0IHsKICAgICAgICBjb2xvcjogI2JhYTZiOTsKICAgIH0KCiAgICAud29yZGluZyBzcGFuLnByZXByb2Nlc3NvcmRpcmVjdGl2ZSB7CiAgICAgICAgY29sb3I6ICNiMjdjNTg7CiAgICB9CgogICAgLndvcmRpbmcgdGFibGUgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZC5ib3JkZXIgewogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRyLnJvd3NlcCwgdGQuY2xpbmUgewogICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNkMGQwZDA7CiAgICB9CgogICAgLndvcmRpbmcgdHIuY2Fwc2VwIHsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHRoIHsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIC5mb290bm90ZVNlcGFyYXRvciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyB0ZXh0IHsKICAgICAgICBmaWxsOiAjZDBkMGQwOwogICAgfQoKICAgIC53b3JkaW5nIHBhdGggewogICAgICAgIHN0cm9rZTogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBwb2x5Z29uIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICAgICAgZmlsbDogI2QwZDBkMDsKICAgIH0KCiAgICAud29yZGluZyBlbGxpcHNlIHsKICAgICAgICBzdHJva2U6ICNkMGQwZDA7CiAgICB9Cgp9Cgoud29yZGluZyAubWp4LWNodG1sIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgdGV4dC1pbmRlbnQ6IDA7CiAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgZm9udC1zaXplOiAxMDAlOwogICAgZm9udC1zaXplLWFkanVzdDogbm9uZTsKICAgIGxldHRlci1zcGFjaW5nOiBub3JtYWw7CiAgICB3b3JkLXdyYXA6IG5vcm1hbDsKICAgIHdvcmQtc3BhY2luZzogbm9ybWFsOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGZsb2F0OiBub25lOwogICAgZGlyZWN0aW9uOiBsdHI7CiAgICBtYXgtd2lkdGg6IG5vbmU7CiAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgbWluLXdpZHRoOiAwOwogICAgbWluLWhlaWdodDogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDFweCAwCn0KCi53b3JkaW5nIC5NSlhjLWRpc3BsYXkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgbWFyZ2luOiAxZW0gMDsKICAgIHBhZGRpbmc6IDAKfQoKLndvcmRpbmcgLm1qeC1jaHRtbFt0YWJpbmRleF06Zm9jdXMsIC53b3JkaW5nICA6Zm9jdXMgLm1qeC1jaHRtbFt0YWJpbmRleF0gewogICAgZGlzcGxheTogaW5saW5lLXRhYmxlCn0KCi53b3JkaW5nIC5tangtZnVsbC13aWR0aCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbQp9Cgoud29yZGluZyAubWp4LW1hdGggewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKICAgIGJvcmRlci1zcGFjaW5nOiAwCn0KCi53b3JkaW5nIC5tangtbWF0aCAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3ggIWltcG9ydGFudDsKICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Cn0KCi53b3JkaW5nIC5tangtbnVtZXJhdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWRlbm9taW5hdG9yIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkIHsKICAgIGhlaWdodDogMDsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZQp9Cgoud29yZGluZyAuTUpYYy1zdGFja2VkID4gKiB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGUKfQoKLndvcmRpbmcgLk1KWGMtYmV2ZWxsZWQgPiAqIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LXN0YWNrIHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jawp9Cgoud29yZGluZyAubWp4LW9wIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXVuZGVyIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC1vdmVyIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LW92ZXIgPiAqIHsKICAgIHBhZGRpbmctbGVmdDogMHB4ICFpbXBvcnRhbnQ7CiAgICBwYWRkaW5nLXJpZ2h0OiAwcHggIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LXVuZGVyID4gKiB7CiAgICBwYWRkaW5nLWxlZnQ6IDBweCAhaW1wb3J0YW50OwogICAgcGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQKfQoKLndvcmRpbmcgLm1qeC1zdGFjayA+IC5tangtc3VwIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LXN0YWNrID4gLm1qeC1zdWIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0Cn0KCi53b3JkaW5nIC5tangtcHJlc3RhY2sgPiAubWp4LXByZXN1cCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1wcmVzdGFjayA+IC5tangtcHJlc3ViIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYmFja2dyb3VuZDogaW5oZXJpdAp9Cgoud29yZGluZyAubWp4LWRlbGltLWggPiAubWp4LWNoYXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrCn0KCi53b3JkaW5nIC5tangtc3VyZCB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCn0KCi53b3JkaW5nIC5tangtbXBoYW50b20gKiB7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW4KfQoKLndvcmRpbmcgLm1qeC1tZXJyb3IgewogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkY4ODsKICAgIGNvbG9yOiAjQ0MwMDAwOwogICAgYm9yZGVyOiAxcHggc29saWQgI0NDMDAwMDsKICAgIHBhZGRpbmc6IDJweCAzcHg7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXNpemU6IDkwJQp9Cgoud29yZGluZyAubWp4LWFubm90YXRpb24teG1sIHsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLm1qeC1tZW5jbG9zZSA+IHN2ZyB7CiAgICBmaWxsOiBub25lOwogICAgc3Ryb2tlOiBjdXJyZW50Q29sb3IKfQoKLndvcmRpbmcgLm1qeC1tdHIgewogICAgZGlzcGxheTogdGFibGUtcm93Cn0KCi53b3JkaW5nIC5tangtbWxhYmVsZWR0ciB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1tdGQgewogICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgIHRleHQtYWxpZ246IGNlbnRlcgp9Cgoud29yZGluZyAubWp4LWxhYmVsIHsKICAgIGRpc3BsYXk6IHRhYmxlLXJvdwp9Cgoud29yZGluZyAubWp4LWJveCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2sKfQoKLndvcmRpbmcgLm1qeC1ibG9jayB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQKfQoKLndvcmRpbmcgLm1qeC1zcGFuIHsKICAgIGRpc3BsYXk6IGlubGluZQp9Cgoud29yZGluZyAubWp4LWNoYXIgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OwogICAgd2hpdGUtc3BhY2U6IHByZQp9Cgoud29yZGluZyAubWp4LWl0YWJsZSB7CiAgICBkaXNwbGF5OiBpbmxpbmUtdGFibGU7CiAgICB3aWR0aDogYXV0bwp9Cgoud29yZGluZyAubWp4LXJvdyB7CiAgICBkaXNwbGF5OiB0YWJsZS1yb3cKfQoKLndvcmRpbmcgLm1qeC1jZWxsIHsKICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwKfQoKLndvcmRpbmcgLm1qeC10YWJsZSB7CiAgICBkaXNwbGF5OiB0YWJsZTsKICAgIHdpZHRoOiAxMDAlCn0KCi53b3JkaW5nIC5tangtbGluZSB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICBoZWlnaHQ6IDAKfQoKLndvcmRpbmcgLm1qeC1zdHJ1dCB7CiAgICB3aWR0aDogMDsKICAgIHBhZGRpbmctdG9wOiAxZW0KfQoKLndvcmRpbmcgLm1qeC12c2l6ZSB7CiAgICB3aWR0aDogMAp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTEgewogICAgbWFyZ2luLWxlZnQ6IC4xNjdlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTIgewogICAgbWFyZ2luLWxlZnQ6IC4yMjJlbQp9Cgoud29yZGluZyAuTUpYYy1zcGFjZTMgewogICAgbWFyZ2luLWxlZnQ6IC4yNzhlbQp9Cgoud29yZGluZyAubWp4LWV4LWJveC10ZXN0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCQlvdmVyZmxvdy14OiBzY3JvbGw7CiAgICBvdmVyZmxvdy15OiB2aXNpYmxlOwogICAgd2lkdGg6IDFweDsKICAgIGhlaWdodDogNjBleAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3QgewogICAgZGlzcGxheTogdGFibGUgIWltcG9ydGFudAp9Cgoud29yZGluZyAubWp4LWxpbmUtYm94LXRlc3Qgc3BhbiB7CiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7CiAgICB3aWR0aDogMTAwMDBlbSAhaW1wb3J0YW50OwogICAgbWluLXdpZHRoOiAwOwogICAgbWF4LXdpZHRoOiBub25lOwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogMDsKICAgIG1hcmdpbjogMAp9Cgoud29yZGluZyAuTUpYYy1UZVgtdW5rbm93bi1SIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICBmb250LXdlaWdodDogbm9ybWFsCn0KCi53b3JkaW5nIC5NSlhjLVRlWC11bmtub3duLUkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBub3JtYWwKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQiB7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgZm9udC1zdHlsZTogbm9ybWFsOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXVua25vd24tQkkgewogICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1hbXMtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVIsIE1KWGMtVGVYLWFtcy1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtY2FsLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1CLCBNSlhjLVRlWC1jYWwtQngsIE1KWGMtVGVYLWNhbC1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtZnJhay1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVIsIE1KWGMtVGVYLWZyYWstUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLWZyYWstQiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtZnJhay1CLCBNSlhjLVRlWC1mcmFrLUJ4LCBNSlhjLVRlWC1mcmFrLUJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUJJIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJLCBNSlhjLVRlWC1tYXRoLUJJeCwgTUpYYy1UZVgtbWF0aC1CSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNhbnMtUiB7CiAgICBmb250LWZhbWlseTogJ05vdG8gU2Fucyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zYW5zLUIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQiwgTUpYYy1UZVgtc2Fucy1CeCwgTUpYYy1UZVgtc2Fucy1Cdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2Fucy1JIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUksIE1KWGMtVGVYLXNhbnMtSXgsIE1KWGMtVGVYLXNhbnMtSXcKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNjcmlwdC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zY3JpcHQtUiwgTUpYYy1UZVgtc2NyaXB0LVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC10eXBlLVIgewogICAgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMgTW9ubyc7CiAgICBmb250LXNpemU6IDEwcHQ7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1jYWwtUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLVIsIE1KWGMtVGVYLWNhbC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtbWFpbi1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUIsIE1KWGMtVGVYLW1haW4tQngsIE1KWGMtVGVYLW1haW4tQncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tSSB7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKLndvcmRpbmcgLk1KWGMtVGVYLW1haW4tUiB7Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1tYXRoLUkgewogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplMS1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMS1SLCBNSlhjLVRlWC1zaXplMS1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtc2l6ZTItUiB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTItUiwgTUpYYy1UZVgtc2l6ZTItUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXNpemUzLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUzLVIsIE1KWGMtVGVYLXNpemUzLVJ3Cn0KCi53b3JkaW5nIC5NSlhjLVRlWC1zaXplNC1SIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplNC1SLCBNSlhjLVRlWC1zaXplNC1Sdwp9Cgoud29yZGluZyAuTUpYYy1UZVgtdmVjLVIgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SLCBNSlhjLVRlWC12ZWMtUncKfQoKLndvcmRpbmcgLk1KWGMtVGVYLXZlYy1CIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtQiwgTUpYYy1UZVgtdmVjLUJ4LCBNSlhjLVRlWC12ZWMtQncKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtYW1zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0FNUycpLCBsb2NhbCgnTWF0aEpheF9BTVMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWFtcy1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQU1TLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9BTVMtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0FNUy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9DYWxpZ3JhcGhpYycpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtY2FsLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9DYWxpZ3JhcGhpYy1Cb2xkLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfQ2FsaWdyYXBoaWMtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0NhbGlncmFwaGljLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1cicpLCBsb2NhbCgnTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1mcmFrLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9GcmFrdHVyLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfRnJha3R1ciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXItQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X0ZyYWt0dXInKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWZyYWstQnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X0ZyYWt0dXItQm9sZC5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0ZyYWt0dXItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X0ZyYWt0dXItQm9sZC5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1CSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCBCb2xkSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtQm9sZEl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtQkl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYXRoJyk7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc3R5bGU6IGl0YWxpYwp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUJJdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWF0aC1Cb2xkSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2Fuc1NlcmlmLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TYW5zU2VyaWYtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1COwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYgQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9TYW5zU2VyaWYtQm9sZCcpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtQng7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC13ZWlnaHQ6IGJvbGQKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2Fucy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2Fuc1NlcmlmLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NhbnNTZXJpZi1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zYW5zLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYycpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXg7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NhbnNTZXJpZicpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNhbnMtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NhbnNTZXJpZi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TYW5zU2VyaWYtSXRhbGljLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2Fuc1NlcmlmLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2NyaXB0LVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NjcmlwdCcpLCBsb2NhbCgnTWF0aEpheF9TY3JpcHQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNjcmlwdC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2NyaXB0LVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TY3JpcHQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NjcmlwdC1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC10eXBlLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1R5cGV3cml0ZXInKSwgbG9jYWwoJ01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdHlwZS1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfVHlwZXdyaXRlci1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1jYWwtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMnKSwgbG9jYWwoJ01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLWNhbC1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfQ2FsaWdyYXBoaWMtUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X0NhbGlncmFwaGljLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9DYWxpZ3JhcGhpYy1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4gQm9sZCcpLCBsb2NhbCgnTWF0aEpheF9NYWluLUJvbGQnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXdlaWdodDogYm9sZAp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9NYWluLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUJvbGQud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYWluLUJvbGQub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1haW4tSTsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWFpbiBJdGFsaWMnKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1JdGFsaWMnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLUl4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9NYWluJyk7CiAgICBmb250LXN0eWxlOiBpdGFsaWMKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1JdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1JdGFsaWMuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9NYWluLUl0YWxpYy53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X01haW4tSXRhbGljLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYWluLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01haW4nKSwgbG9jYWwoJ01hdGhKYXhfTWFpbi1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWFpbi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfTWFpbi1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWFpbi1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfTWFpbi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1tYXRoLUk7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X01hdGggSXRhbGljJyksIGxvY2FsKCdNYXRoSmF4X01hdGgtSXRhbGljJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtbWF0aC1JeDsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfTWF0aCcpOwogICAgZm9udC1zdHlsZTogaXRhbGljCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLW1hdGgtSXc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X01hdGgtSXRhbGljLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfTWF0aC1JdGFsaWMud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9NYXRoLUl0YWxpYy5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTEtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTEnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTEtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUxLVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplMS1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTEtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemUxLVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemUyLVI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1NpemUyJyksIGxvY2FsKCdNYXRoSmF4X1NpemUyLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMi1SdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfU2l6ZTItUmVndWxhci5lb3QnKTsKICAgIHNyYyAvKjIqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvd29mZi9NYXRoSmF4X1NpemUyLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9TaXplMi1SZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC1zaXplMy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9TaXplMycpLCBsb2NhbCgnTWF0aEpheF9TaXplMy1SZWd1bGFyJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1NpemUzLVJlZ3VsYXIuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9TaXplMy1SZWd1bGFyLndvZmYnKSBmb3JtYXQoJ3dvZmYnKSwgdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvb3RmL01hdGhKYXhfU2l6ZTMtUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtc2l6ZTQtUjsKICAgIHNyYzogbG9jYWwoJ01hdGhKYXhfU2l6ZTQnKSwgbG9jYWwoJ01hdGhKYXhfU2l6ZTQtUmVndWxhcicpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXNpemU0LVJ3OwogICAgc3JjIC8qMSovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9lb3QvTWF0aEpheF9TaXplNC1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfU2l6ZTQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1NpemU0LVJlZ3VsYXIub3RmJykgZm9ybWF0KCdvcGVudHlwZScpCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1SOwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKSwgbG9jYWwoJ01hdGhKYXhfVmVjdG9yLVJlZ3VsYXInKQp9CgpAZm9udC1mYWNlIHsKICAgIGZvbnQtZmFtaWx5OiBNSlhjLVRlWC12ZWMtUnc7CiAgICBzcmMgLyoxKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL2VvdC9NYXRoSmF4X1ZlY3Rvci1SZWd1bGFyLmVvdCcpOwogICAgc3JjIC8qMiovOiB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC93b2ZmL01hdGhKYXhfVmVjdG9yLVJlZ3VsYXIud29mZicpIGZvcm1hdCgnd29mZicpLCB1cmwoJ2h0dHBzOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0L2ZvbnRzL0hUTUwtQ1NTL1RlWC9vdGYvTWF0aEpheF9WZWN0b3ItUmVndWxhci5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUI7CiAgICBzcmM6IGxvY2FsKCdNYXRoSmF4X1ZlY3RvciBCb2xkJyksIGxvY2FsKCdNYXRoSmF4X1ZlY3Rvci1Cb2xkJykKfQoKQGZvbnQtZmFjZSB7CiAgICBmb250LWZhbWlseTogTUpYYy1UZVgtdmVjLUJ4OwogICAgc3JjOiBsb2NhbCgnTWF0aEpheF9WZWN0b3InKTsKICAgIGZvbnQtd2VpZ2h0OiBib2xkCn0KCkBmb250LWZhY2UgewogICAgZm9udC1mYW1pbHk6IE1KWGMtVGVYLXZlYy1CdzsKICAgIHNyYyAvKjEqLzogdXJsKCdodHRwczovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdC9mb250cy9IVE1MLUNTUy9UZVgvZW90L01hdGhKYXhfVmVjdG9yLUJvbGQuZW90Jyk7CiAgICBzcmMgLyoyKi86IHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL3dvZmYvTWF0aEpheF9WZWN0b3ItQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyksIHVybCgnaHR0cHM6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QvZm9udHMvSFRNTC1DU1MvVGVYL290Zi9NYXRoSmF4X1ZlY3Rvci1Cb2xkLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKQp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogMTFwdDsKCWNvbG9yOiAjYmIwMGJiOwp9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSB7CglkaXNwbGF5OiBibG9jazsKCW1hcmdpbi10b3A6IDVwdDsKCW1hcmdpbi1ib3R0b206IDVwdDsKCWZvbnQtc2l6ZTogOXB0Owp9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHR0IHsgZm9udC1zaXplOiA5cHQ7IH0KLndvcmRpbmcgZGl2LmV4YW1wbGUgLnRleHR0dCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYubm90ZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAudGV4dHNmIHsgZm9udC1mYW1pbHk6ICdOb3RvIFNhbnMnOyBmb250LXNpemU6IDlwdDsgfQoKLndvcmRpbmcgZGl2Lm5vdGUgLm1hdGggeyBmb250LXNpemU6IDlwdDsgfQoud29yZGluZyBkaXYuZXhhbXBsZSAubWF0aCB7IGZvbnQtc2l6ZTogOXB0OyB9Cgoud29yZGluZyBkaXYuZXhhbXBsZSB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgZGl2Lm5vdGUgeyBkaXNwbGF5OiBub25lOyB9Cgoud29yZGluZyBhLmZvb3Rub3RlbnVtIHsgZGlzcGxheTogbm9uZTsgfQoud29yZGluZyBkaXYuZm9vdG5vdGUgeyBkaXNwbGF5OiBub25lOyB9Ci53b3JkaW5nIGRpdi5mb290bm90ZVNlcGFyYXRvciB7IGRpc3BsYXk6IG5vbmU7IH0KLndvcmRpbmcgLmZvb3Rub3RlcmVmIHsgZGlzcGxheTogbm9uZTsgfQoKLndvcmRpbmcgZGl2Lm5vbk5vcm1hdGl2ZU9ubHkgeyBkaXNwbGF5OiBub25lOyB9Cgo=">
<link href="https://fonts.googleapis.com/css?family=Noto+Serif" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans" rel='stylesheet'>
<link href="https://fonts.googleapis.com/css?family=Noto+Sans+Mono" rel='stylesheet'>
<script src="data:text/javascript;base64,LyohCiAgSGlnaGxpZ2h0LmpzIHYxMS45LjAgKGdpdDogYjdlYzRiZmFmYykKICAoYykgMjAwNi0yMDI0IHVuZGVmaW5lZCBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAgTGljZW5zZTogQlNELTMtQ2xhdXNlCiAqLwp2YXIgaGxqcz1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQpewpyZXR1cm4gdCBpbnN0YW5jZW9mIE1hcD90LmNsZWFyPXQuZGVsZXRlPXQuc2V0PSgpPT57CnRocm93IEVycm9yKCJtYXAgaXMgcmVhZC1vbmx5Iil9OnQgaW5zdGFuY2VvZiBTZXQmJih0LmFkZD10LmNsZWFyPXQuZGVsZXRlPSgpPT57CnRocm93IEVycm9yKCJzZXQgaXMgcmVhZC1vbmx5IikKfSksT2JqZWN0LmZyZWV6ZSh0KSxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5mb3JFYWNoKChuPT57CmNvbnN0IGk9dFtuXSxzPXR5cGVvZiBpOyJvYmplY3QiIT09cyYmImZ1bmN0aW9uIiE9PXN8fE9iamVjdC5pc0Zyb3plbihpKXx8ZShpKQp9KSksdH1jbGFzcyB0e2NvbnN0cnVjdG9yKGUpewp2b2lkIDA9PT1lLmRhdGEmJihlLmRhdGE9e30pLHRoaXMuZGF0YT1lLmRhdGEsdGhpcy5pc01hdGNoSWdub3JlZD0hMX0KaWdub3JlTWF0Y2goKXt0aGlzLmlzTWF0Y2hJZ25vcmVkPSEwfX1mdW5jdGlvbiBuKGUpewpyZXR1cm4gZS5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjeDI3OyIpCn1mdW5jdGlvbiBpKGUsLi4udCl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdCB0IGluIGUpblt0XT1lW3RdCjtyZXR1cm4gdC5mb3JFYWNoKChlPT57Zm9yKGNvbnN0IHQgaW4gZSluW3RdPWVbdF19KSksbn1jb25zdCBzPWU9PiEhZS5zY29wZQo7Y2xhc3Mgb3tjb25zdHJ1Y3RvcihlLHQpewp0aGlzLmJ1ZmZlcj0iIix0aGlzLmNsYXNzUHJlZml4PXQuY2xhc3NQcmVmaXgsZS53YWxrKHRoaXMpfWFkZFRleHQoZSl7CnRoaXMuYnVmZmVyKz1uKGUpfW9wZW5Ob2RlKGUpe2lmKCFzKGUpKXJldHVybjtjb25zdCB0PSgoZSx7cHJlZml4OnR9KT0+ewppZihlLnN0YXJ0c1dpdGgoImxhbmd1YWdlOiIpKXJldHVybiBlLnJlcGxhY2UoImxhbmd1YWdlOiIsImxhbmd1YWdlLSIpCjtpZihlLmluY2x1ZGVzKCIuIikpe2NvbnN0IG49ZS5zcGxpdCgiLiIpCjtyZXR1cm5bYCR7dH0ke24uc2hpZnQoKX1gLC4uLm4ubWFwKCgoZSx0KT0+YCR7ZX0keyJfIi5yZXBlYXQodCsxKX1gKSldLmpvaW4oIiAiKQp9cmV0dXJuYCR7dH0ke2V9YH0pKGUuc2NvcGUse3ByZWZpeDp0aGlzLmNsYXNzUHJlZml4fSk7dGhpcy5zcGFuKHQpfQpjbG9zZU5vZGUoZSl7cyhlKSYmKHRoaXMuYnVmZmVyKz0iPC9zcGFuPiIpfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNwYW4oZSl7CnRoaXMuYnVmZmVyKz1gPHNwYW4gY2xhc3M9IiR7ZX0iPmB9fWNvbnN0IHI9KGU9e30pPT57Y29uc3QgdD17Y2hpbGRyZW46W119CjtyZXR1cm4gT2JqZWN0LmFzc2lnbih0LGUpLHR9O2NsYXNzIGF7Y29uc3RydWN0b3IoKXsKdGhpcy5yb290Tm9kZT1yKCksdGhpcy5zdGFjaz1bdGhpcy5yb290Tm9kZV19Z2V0IHRvcCgpewpyZXR1cm4gdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXX1nZXQgcm9vdCgpe3JldHVybiB0aGlzLnJvb3ROb2RlfWFkZChlKXsKdGhpcy50b3AuY2hpbGRyZW4ucHVzaChlKX1vcGVuTm9kZShlKXtjb25zdCB0PXIoe3Njb3BlOmV9KQo7dGhpcy5hZGQodCksdGhpcy5zdGFjay5wdXNoKHQpfWNsb3NlTm9kZSgpewppZih0aGlzLnN0YWNrLmxlbmd0aD4xKXJldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNsb3NlQWxsTm9kZXMoKXsKZm9yKDt0aGlzLmNsb3NlTm9kZSgpOyk7fXRvSlNPTigpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3ROb2RlLG51bGwsNCl9CndhbGsoZSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IuX3dhbGsoZSx0aGlzLnJvb3ROb2RlKX1zdGF0aWMgX3dhbGsoZSx0KXsKcmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UuYWRkVGV4dCh0KTp0LmNoaWxkcmVuJiYoZS5vcGVuTm9kZSh0KSwKdC5jaGlsZHJlbi5mb3JFYWNoKCh0PT50aGlzLl93YWxrKGUsdCkpKSxlLmNsb3NlTm9kZSh0KSksZX1zdGF0aWMgX2NvbGxhcHNlKGUpewoic3RyaW5nIiE9dHlwZW9mIGUmJmUuY2hpbGRyZW4mJihlLmNoaWxkcmVuLmV2ZXJ5KChlPT4ic3RyaW5nIj09dHlwZW9mIGUpKT9lLmNoaWxkcmVuPVtlLmNoaWxkcmVuLmpvaW4oIiIpXTplLmNoaWxkcmVuLmZvckVhY2goKGU9PnsKYS5fY29sbGFwc2UoZSl9KSkpfX1jbGFzcyBjIGV4dGVuZHMgYXtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMub3B0aW9ucz1lfQphZGRUZXh0KGUpeyIiIT09ZSYmdGhpcy5hZGQoZSl9c3RhcnRTY29wZShlKXt0aGlzLm9wZW5Ob2RlKGUpfWVuZFNjb3BlKCl7CnRoaXMuY2xvc2VOb2RlKCl9X19hZGRTdWJsYW5ndWFnZShlLHQpe2NvbnN0IG49ZS5yb290Cjt0JiYobi5zY29wZT0ibGFuZ3VhZ2U6Iit0KSx0aGlzLmFkZChuKX10b0hUTUwoKXsKcmV0dXJuIG5ldyBvKHRoaXMsdGhpcy5vcHRpb25zKS52YWx1ZSgpfWZpbmFsaXplKCl7CnJldHVybiB0aGlzLmNsb3NlQWxsTm9kZXMoKSwhMH19ZnVuY3Rpb24gbChlKXsKcmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5zb3VyY2U6bnVsbH1mdW5jdGlvbiBnKGUpe3JldHVybiBoKCIoPz0iLGUsIikiKX0KZnVuY3Rpb24gdShlKXtyZXR1cm4gaCgiKD86IixlLCIpKiIpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGgoIig/OiIsZSwiKT8iKX0KZnVuY3Rpb24gaCguLi5lKXtyZXR1cm4gZS5tYXAoKGU9PmwoZSkpKS5qb2luKCIiKX1mdW5jdGlvbiBmKC4uLmUpe2NvbnN0IHQ9KGU9PnsKY29uc3QgdD1lW2UubGVuZ3RoLTFdCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1PYmplY3Q/KGUuc3BsaWNlKGUubGVuZ3RoLTEsMSksdCk6e30KfSkoZSk7cmV0dXJuIigiKyh0LmNhcHR1cmU/IiI6Ij86IikrZS5tYXAoKGU9PmwoZSkpKS5qb2luKCJ8IikrIikifQpmdW5jdGlvbiBwKGUpe3JldHVybiBSZWdFeHAoZS50b1N0cmluZygpKyJ8IikuZXhlYygiIikubGVuZ3RoLTF9CmNvbnN0IGI9L1xbKD86W15cXFxdXXxcXC4pKlxdfFwoXD8/fFxcKFsxLTldWzAtOV0qKXxcXC4vCjtmdW5jdGlvbiBtKGUse2pvaW5XaXRoOnR9KXtsZXQgbj0wO3JldHVybiBlLm1hcCgoZT0+e24rPTE7Y29uc3QgdD1uCjtsZXQgaT1sKGUpLHM9IiI7Zm9yKDtpLmxlbmd0aD4wOyl7Y29uc3QgZT1iLmV4ZWMoaSk7aWYoIWUpe3MrPWk7YnJlYWt9CnMrPWkuc3Vic3RyaW5nKDAsZS5pbmRleCksCmk9aS5zdWJzdHJpbmcoZS5pbmRleCtlWzBdLmxlbmd0aCksIlxcIj09PWVbMF1bMF0mJmVbMV0/cys9IlxcIisoTnVtYmVyKGVbMV0pK3QpOihzKz1lWzBdLAoiKCI9PT1lWzBdJiZuKyspfXJldHVybiBzfSkpLm1hcCgoZT0+YCgke2V9KWApKS5qb2luKHQpfQpjb25zdCBFPSJbYS16QS1aXVxcdyoiLHg9IlthLXpBLVpfXVxcdyoiLHc9IlxcYlxcZCsoXFwuXFxkKyk/Iix5PSIoLT8pKFxcYjBbeFhdW2EtZkEtRjAtOV0rfChcXGJcXGQrKFxcLlxcZCopP3xcXC5cXGQrKShbZUVdWy0rXT9cXGQrKT8pIixfPSJcXGIoMGJbMDFdKykiLE89ewpiZWdpbjoiXFxcXFtcXHNcXFNdIixyZWxldmFuY2U6MH0sdj17c2NvcGU6InN0cmluZyIsYmVnaW46IiciLGVuZDoiJyIsCmlsbGVnYWw6IlxcbiIsY29udGFpbnM6W09dfSxrPXtzY29wZToic3RyaW5nIixiZWdpbjonIicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLApjb250YWluczpbT119LE49KGUsdCxuPXt9KT0+e2NvbnN0IHM9aSh7c2NvcGU6ImNvbW1lbnQiLGJlZ2luOmUsZW5kOnQsCmNvbnRhaW5zOltdfSxuKTtzLmNvbnRhaW5zLnB1c2goe3Njb3BlOiJkb2N0YWciLApiZWdpbjoiWyBdKig/PShUT0RPfEZJWE1FfE5PVEV8QlVHfE9QVElNSVpFfEhBQ0t8WFhYKTopIiwKZW5kOi8oVE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6LyxleGNsdWRlQmVnaW46ITAscmVsZXZhbmNlOjB9KQo7Y29uc3Qgbz1mKCJJIiwiYSIsImlzIiwic28iLCJ1cyIsInRvIiwiYXQiLCJpZiIsImluIiwiaXQiLCJvbiIsL1tBLVphLXpdK1snXShkfHZlfHJlfGxsfHR8c3xuKS8sL1tBLVphLXpdK1stXVthLXpdKy8sL1tBLVphLXpdW2Etel17Mix9LykKO3JldHVybiBzLmNvbnRhaW5zLnB1c2goe2JlZ2luOmgoL1sgXSsvLCIoIixvLC9bLl0/WzpdPyhbLl1bIF18WyBdKS8sIil7M30iKX0pLHMKfSxTPU4oIi8vIiwiJCIpLE09TigiL1xcKiIsIlxcKi8iKSxSPU4oIiMiLCIkIik7dmFyIGo9T2JqZWN0LmZyZWV6ZSh7Cl9fcHJvdG9fXzpudWxsLEFQT1NfU1RSSU5HX01PREU6dixCQUNLU0xBU0hfRVNDQVBFOk8sQklOQVJZX05VTUJFUl9NT0RFOnsKc2NvcGU6Im51bWJlciIsYmVnaW46XyxyZWxldmFuY2U6MH0sQklOQVJZX05VTUJFUl9SRTpfLENPTU1FTlQ6TiwKQ19CTE9DS19DT01NRU5UX01PREU6TSxDX0xJTkVfQ09NTUVOVF9NT0RFOlMsQ19OVU1CRVJfTU9ERTp7c2NvcGU6Im51bWJlciIsCmJlZ2luOnkscmVsZXZhbmNlOjB9LENfTlVNQkVSX1JFOnksRU5EX1NBTUVfQVNfQkVHSU46ZT0+T2JqZWN0LmFzc2lnbihlLHsKIm9uOmJlZ2luIjooZSx0KT0+e3QuZGF0YS5fYmVnaW5NYXRjaD1lWzFdfSwib246ZW5kIjooZSx0KT0+ewp0LmRhdGEuX2JlZ2luTWF0Y2ghPT1lWzFdJiZ0Lmlnbm9yZU1hdGNoKCl9fSksSEFTSF9DT01NRU5UX01PREU6UixJREVOVF9SRTpFLApNQVRDSF9OT1RISU5HX1JFOi9cYlxCLyxNRVRIT0RfR1VBUkQ6e2JlZ2luOiJcXC5cXHMqIit4LHJlbGV2YW5jZTowfSwKTlVNQkVSX01PREU6e3Njb3BlOiJudW1iZXIiLGJlZ2luOncscmVsZXZhbmNlOjB9LE5VTUJFUl9SRTp3LApQSFJBU0FMX1dPUkRTX01PREU6ewpiZWdpbjovXGIoYXxhbnx0aGV8YXJlfEknbXxpc24ndHxkb24ndHxkb2Vzbid0fHdvbid0fGJ1dHxqdXN0fHNob3VsZHxwcmV0dHl8c2ltcGx5fGVub3VnaHxnb25uYXxnb2luZ3x3dGZ8c298c3VjaHx3aWxsfHlvdXx5b3VyfHRoZXl8bGlrZXxtb3JlKVxiLwp9LFFVT1RFX1NUUklOR19NT0RFOmssUkVHRVhQX01PREU6e3Njb3BlOiJyZWdleHAiLGJlZ2luOi9cLyg/PVteL1xuXSpcLykvLAplbmQ6L1wvW2dpbXV5XSovLGNvbnRhaW5zOltPLHtiZWdpbjovXFsvLGVuZDovXF0vLHJlbGV2YW5jZTowLGNvbnRhaW5zOltPXX1dfSwKUkVfU1RBUlRFUlNfUkU6IiF8IT18IT09fCV8JT18JnwmJnwmPXxcXCp8XFwqPXxcXCt8XFwrPXwsfC18LT18Lz18L3w6fDt8PDx8PDw9fDw9fDx8PT09fD09fD18Pj4+PXw+Pj18Pj18Pj4+fD4+fD58XFw/fFxcW3xcXHt8XFwofFxcXnxcXF49fFxcfHxcXHw9fFxcfFxcfHx+IiwKU0hFQkFORzooZT17fSk9Pntjb25zdCB0PS9eIyFbIF0qXC8vCjtyZXR1cm4gZS5iaW5hcnkmJihlLmJlZ2luPWgodCwvLipcYi8sZS5iaW5hcnksL1xiLiovKSksaSh7c2NvcGU6Im1ldGEiLGJlZ2luOnQsCmVuZDovJC8scmVsZXZhbmNlOjAsIm9uOmJlZ2luIjooZSx0KT0+ezAhPT1lLmluZGV4JiZ0Lmlnbm9yZU1hdGNoKCl9fSxlKX0sClRJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46RSxyZWxldmFuY2U6MH0sVU5ERVJTQ09SRV9JREVOVF9SRTp4LApVTkRFUlNDT1JFX1RJVExFX01PREU6e3Njb3BlOiJ0aXRsZSIsYmVnaW46eCxyZWxldmFuY2U6MH19KTtmdW5jdGlvbiBBKGUsdCl7CiIuIj09PWUuaW5wdXRbZS5pbmRleC0xXSYmdC5pZ25vcmVNYXRjaCgpfWZ1bmN0aW9uIEkoZSx0KXsKdm9pZCAwIT09ZS5jbGFzc05hbWUmJihlLnNjb3BlPWUuY2xhc3NOYW1lLGRlbGV0ZSBlLmNsYXNzTmFtZSl9ZnVuY3Rpb24gVChlLHQpewp0JiZlLmJlZ2luS2V5d29yZHMmJihlLmJlZ2luPSJcXGIoIitlLmJlZ2luS2V5d29yZHMuc3BsaXQoIiAiKS5qb2luKCJ8IikrIikoPyFcXC4pKD89XFxifFxccykiLAplLl9fYmVmb3JlQmVnaW49QSxlLmtleXdvcmRzPWUua2V5d29yZHN8fGUuYmVnaW5LZXl3b3JkcyxkZWxldGUgZS5iZWdpbktleXdvcmRzLAp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTApKX1mdW5jdGlvbiBMKGUsdCl7CkFycmF5LmlzQXJyYXkoZS5pbGxlZ2FsKSYmKGUuaWxsZWdhbD1mKC4uLmUuaWxsZWdhbCkpfWZ1bmN0aW9uIEIoZSx0KXsKaWYoZS5tYXRjaCl7CmlmKGUuYmVnaW58fGUuZW5kKXRocm93IEVycm9yKCJiZWdpbiAmIGVuZCBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIG1hdGNoIikKO2UuYmVnaW49ZS5tYXRjaCxkZWxldGUgZS5tYXRjaH19ZnVuY3Rpb24gUChlLHQpewp2b2lkIDA9PT1lLnJlbGV2YW5jZSYmKGUucmVsZXZhbmNlPTEpfWNvbnN0IEQ9KGUsdCk9PntpZighZS5iZWZvcmVNYXRjaClyZXR1cm4KO2lmKGUuc3RhcnRzKXRocm93IEVycm9yKCJiZWZvcmVNYXRjaCBjYW5ub3QgYmUgdXNlZCB3aXRoIHN0YXJ0cyIpCjtjb25zdCBuPU9iamVjdC5hc3NpZ24oe30sZSk7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e2RlbGV0ZSBlW3RdCn0pKSxlLmtleXdvcmRzPW4ua2V5d29yZHMsZS5iZWdpbj1oKG4uYmVmb3JlTWF0Y2gsZyhuLmJlZ2luKSksZS5zdGFydHM9ewpyZWxldmFuY2U6MCxjb250YWluczpbT2JqZWN0LmFzc2lnbihuLHtlbmRzUGFyZW50OiEwfSldCn0sZS5yZWxldmFuY2U9MCxkZWxldGUgbi5iZWZvcmVNYXRjaAp9LEg9WyJvZiIsImFuZCIsImZvciIsImluIiwibm90Iiwib3IiLCJpZiIsInRoZW4iLCJwYXJlbnQiLCJsaXN0IiwidmFsdWUiXSxDPSJrZXl3b3JkIgo7ZnVuY3Rpb24gJChlLHQsbj1DKXtjb25zdCBpPU9iamVjdC5jcmVhdGUobnVsbCkKO3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9zKG4sZS5zcGxpdCgiICIpKTpBcnJheS5pc0FycmF5KGUpP3MobixlKTpPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuPT57Ck9iamVjdC5hc3NpZ24oaSwkKGVbbl0sdCxuKSl9KSksaTtmdW5jdGlvbiBzKGUsbil7CnQmJihuPW4ubWFwKChlPT5lLnRvTG93ZXJDYXNlKCkpKSksbi5mb3JFYWNoKCh0PT57Y29uc3Qgbj10LnNwbGl0KCJ8IikKO2lbblswXV09W2UsVShuWzBdLG5bMV0pXX0pKX19ZnVuY3Rpb24gVShlLHQpewpyZXR1cm4gdD9OdW1iZXIodCk6KGU9PkguaW5jbHVkZXMoZS50b0xvd2VyQ2FzZSgpKSkoZSk/MDoxfWNvbnN0IHo9e30sVz1lPT57CmNvbnNvbGUuZXJyb3IoZSl9LFg9KGUsLi4udCk9Pntjb25zb2xlLmxvZygiV0FSTjogIitlLC4uLnQpfSxHPShlLHQpPT57CnpbYCR7ZX0vJHt0fWBdfHwoY29uc29sZS5sb2coYERlcHJlY2F0ZWQgYXMgb2YgJHtlfS4gJHt0fWApLHpbYCR7ZX0vJHt0fWBdPSEwKQp9LEs9RXJyb3IoKTtmdW5jdGlvbiBGKGUsdCx7a2V5Om59KXtsZXQgaT0wO2NvbnN0IHM9ZVtuXSxvPXt9LHI9e30KO2ZvcihsZXQgZT0xO2U8PXQubGVuZ3RoO2UrKylyW2UraV09c1tlXSxvW2UraV09ITAsaSs9cCh0W2UtMV0pCjtlW25dPXIsZVtuXS5fZW1pdD1vLGVbbl0uX211bHRpPSEwfWZ1bmN0aW9uIFooZSl7KGU9PnsKZS5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBlLnNjb3BlJiZudWxsIT09ZS5zY29wZSYmKGUuYmVnaW5TY29wZT1lLnNjb3BlLApkZWxldGUgZS5zY29wZSl9KShlKSwic3RyaW5nIj09dHlwZW9mIGUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZT17Cl93cmFwOmUuYmVnaW5TY29wZX0pLCJzdHJpbmciPT10eXBlb2YgZS5lbmRTY29wZSYmKGUuZW5kU2NvcGU9e193cmFwOmUuZW5kU2NvcGUKfSksKGU9PntpZihBcnJheS5pc0FycmF5KGUuYmVnaW4pKXsKaWYoZS5za2lwfHxlLmV4Y2x1ZGVCZWdpbnx8ZS5yZXR1cm5CZWdpbil0aHJvdyBXKCJza2lwLCBleGNsdWRlQmVnaW4sIHJldHVybkJlZ2luIG5vdCBjb21wYXRpYmxlIHdpdGggYmVnaW5TY29wZToge30iKSwKSwo7aWYoIm9iamVjdCIhPXR5cGVvZiBlLmJlZ2luU2NvcGV8fG51bGw9PT1lLmJlZ2luU2NvcGUpdGhyb3cgVygiYmVnaW5TY29wZSBtdXN0IGJlIG9iamVjdCIpLApLO0YoZSxlLmJlZ2luLHtrZXk6ImJlZ2luU2NvcGUifSksZS5iZWdpbj1tKGUuYmVnaW4se2pvaW5XaXRoOiIifSl9fSkoZSksKGU9PnsKaWYoQXJyYXkuaXNBcnJheShlLmVuZCkpewppZihlLnNraXB8fGUuZXhjbHVkZUVuZHx8ZS5yZXR1cm5FbmQpdGhyb3cgVygic2tpcCwgZXhjbHVkZUVuZCwgcmV0dXJuRW5kIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kU2NvcGU6IHt9IiksCksKO2lmKCJvYmplY3QiIT10eXBlb2YgZS5lbmRTY29wZXx8bnVsbD09PWUuZW5kU2NvcGUpdGhyb3cgVygiZW5kU2NvcGUgbXVzdCBiZSBvYmplY3QiKSwKSztGKGUsZS5lbmQse2tleToiZW5kU2NvcGUifSksZS5lbmQ9bShlLmVuZCx7am9pbldpdGg6IiJ9KX19KShlKX1mdW5jdGlvbiBWKGUpewpmdW5jdGlvbiB0KHQsbil7CnJldHVybiBSZWdFeHAobCh0KSwibSIrKGUuY2FzZV9pbnNlbnNpdGl2ZT8iaSI6IiIpKyhlLnVuaWNvZGVSZWdleD8idSI6IiIpKyhuPyJnIjoiIikpCn1jbGFzcyBue2NvbnN0cnVjdG9yKCl7CnRoaXMubWF0Y2hJbmRleGVzPXt9LHRoaXMucmVnZXhlcz1bXSx0aGlzLm1hdGNoQXQ9MSx0aGlzLnBvc2l0aW9uPTB9CmFkZFJ1bGUoZSx0KXsKdC5wb3NpdGlvbj10aGlzLnBvc2l0aW9uKyssdGhpcy5tYXRjaEluZGV4ZXNbdGhpcy5tYXRjaEF0XT10LHRoaXMucmVnZXhlcy5wdXNoKFt0LGVdKSwKdGhpcy5tYXRjaEF0Kz1wKGUpKzF9Y29tcGlsZSgpezA9PT10aGlzLnJlZ2V4ZXMubGVuZ3RoJiYodGhpcy5leGVjPSgpPT5udWxsKQo7Y29uc3QgZT10aGlzLnJlZ2V4ZXMubWFwKChlPT5lWzFdKSk7dGhpcy5tYXRjaGVyUmU9dChtKGUse2pvaW5XaXRoOiJ8Igp9KSwhMCksdGhpcy5sYXN0SW5kZXg9MH1leGVjKGUpe3RoaXMubWF0Y2hlclJlLmxhc3RJbmRleD10aGlzLmxhc3RJbmRleAo7Y29uc3QgdD10aGlzLm1hdGNoZXJSZS5leGVjKGUpO2lmKCF0KXJldHVybiBudWxsCjtjb25zdCBuPXQuZmluZEluZGV4KCgoZSx0KT0+dD4wJiZ2b2lkIDAhPT1lKSksaT10aGlzLm1hdGNoSW5kZXhlc1tuXQo7cmV0dXJuIHQuc3BsaWNlKDAsbiksT2JqZWN0LmFzc2lnbih0LGkpfX1jbGFzcyBze2NvbnN0cnVjdG9yKCl7CnRoaXMucnVsZXM9W10sdGhpcy5tdWx0aVJlZ2V4ZXM9W10sCnRoaXMuY291bnQ9MCx0aGlzLmxhc3RJbmRleD0wLHRoaXMucmVnZXhJbmRleD0wfWdldE1hdGNoZXIoZSl7CmlmKHRoaXMubXVsdGlSZWdleGVzW2VdKXJldHVybiB0aGlzLm11bHRpUmVnZXhlc1tlXTtjb25zdCB0PW5ldyBuCjtyZXR1cm4gdGhpcy5ydWxlcy5zbGljZShlKS5mb3JFYWNoKCgoW2Usbl0pPT50LmFkZFJ1bGUoZSxuKSkpLAp0LmNvbXBpbGUoKSx0aGlzLm11bHRpUmVnZXhlc1tlXT10LHR9cmVzdW1pbmdTY2FuQXRTYW1lUG9zaXRpb24oKXsKcmV0dXJuIDAhPT10aGlzLnJlZ2V4SW5kZXh9Y29uc2lkZXJBbGwoKXt0aGlzLnJlZ2V4SW5kZXg9MH1hZGRSdWxlKGUsdCl7CnRoaXMucnVsZXMucHVzaChbZSx0XSksImJlZ2luIj09PXQudHlwZSYmdGhpcy5jb3VudCsrfWV4ZWMoZSl7CmNvbnN0IHQ9dGhpcy5nZXRNYXRjaGVyKHRoaXMucmVnZXhJbmRleCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgKO2xldCBuPXQuZXhlYyhlKQo7aWYodGhpcy5yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpKWlmKG4mJm4uaW5kZXg9PT10aGlzLmxhc3RJbmRleCk7ZWxzZXsKY29uc3QgdD10aGlzLmdldE1hdGNoZXIoMCk7dC5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXgrMSxuPXQuZXhlYyhlKX0KcmV0dXJuIG4mJih0aGlzLnJlZ2V4SW5kZXgrPW4ucG9zaXRpb24rMSwKdGhpcy5yZWdleEluZGV4PT09dGhpcy5jb3VudCYmdGhpcy5jb25zaWRlckFsbCgpKSxufX0KaWYoZS5jb21waWxlckV4dGVuc2lvbnN8fChlLmNvbXBpbGVyRXh0ZW5zaW9ucz1bXSksCmUuY29udGFpbnMmJmUuY29udGFpbnMuaW5jbHVkZXMoInNlbGYiKSl0aHJvdyBFcnJvcigiRVJSOiBjb250YWlucyBgc2VsZmAgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgdG9wLWxldmVsIG9mIGEgbGFuZ3VhZ2UuICBTZWUgZG9jdW1lbnRhdGlvbi4iKQo7cmV0dXJuIGUuY2xhc3NOYW1lQWxpYXNlcz1pKGUuY2xhc3NOYW1lQWxpYXNlc3x8e30pLGZ1bmN0aW9uIG4obyxyKXtjb25zdCBhPW8KO2lmKG8uaXNDb21waWxlZClyZXR1cm4gYQo7W0ksQixaLERdLmZvckVhY2goKGU9PmUobyxyKSkpLGUuY29tcGlsZXJFeHRlbnNpb25zLmZvckVhY2goKGU9PmUobyxyKSkpLApvLl9fYmVmb3JlQmVnaW49bnVsbCxbVCxMLFBdLmZvckVhY2goKGU9PmUobyxyKSkpLG8uaXNDb21waWxlZD0hMDtsZXQgYz1udWxsCjtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIG8ua2V5d29yZHMmJm8ua2V5d29yZHMuJHBhdHRlcm4mJihvLmtleXdvcmRzPU9iamVjdC5hc3NpZ24oe30sby5rZXl3b3JkcyksCmM9by5rZXl3b3Jkcy4kcGF0dGVybiwKZGVsZXRlIG8ua2V5d29yZHMuJHBhdHRlcm4pLGM9Y3x8L1x3Ky8sby5rZXl3b3JkcyYmKG8ua2V5d29yZHM9JChvLmtleXdvcmRzLGUuY2FzZV9pbnNlbnNpdGl2ZSkpLAphLmtleXdvcmRQYXR0ZXJuUmU9dChjLCEwKSwKciYmKG8uYmVnaW58fChvLmJlZ2luPS9cQnxcYi8pLGEuYmVnaW5SZT10KGEuYmVnaW4pLG8uZW5kfHxvLmVuZHNXaXRoUGFyZW50fHwoby5lbmQ9L1xCfFxiLyksCm8uZW5kJiYoYS5lbmRSZT10KGEuZW5kKSksCmEudGVybWluYXRvckVuZD1sKGEuZW5kKXx8IiIsby5lbmRzV2l0aFBhcmVudCYmci50ZXJtaW5hdG9yRW5kJiYoYS50ZXJtaW5hdG9yRW5kKz0oby5lbmQ/InwiOiIiKStyLnRlcm1pbmF0b3JFbmQpKSwKby5pbGxlZ2FsJiYoYS5pbGxlZ2FsUmU9dChvLmlsbGVnYWwpKSwKby5jb250YWluc3x8KG8uY29udGFpbnM9W10pLG8uY29udGFpbnM9W10uY29uY2F0KC4uLm8uY29udGFpbnMubWFwKChlPT4oZT0+KGUudmFyaWFudHMmJiFlLmNhY2hlZFZhcmlhbnRzJiYoZS5jYWNoZWRWYXJpYW50cz1lLnZhcmlhbnRzLm1hcCgodD0+aShlLHsKdmFyaWFudHM6bnVsbH0sdCkpKSksZS5jYWNoZWRWYXJpYW50cz9lLmNhY2hlZFZhcmlhbnRzOnEoZSk/aShlLHsKc3RhcnRzOmUuc3RhcnRzP2koZS5zdGFydHMpOm51bGwKfSk6T2JqZWN0LmlzRnJvemVuKGUpP2koZSk6ZSkpKCJzZWxmIj09PWU/bzplKSkpKSxvLmNvbnRhaW5zLmZvckVhY2goKGU9PntuKGUsYSkKfSkpLG8uc3RhcnRzJiZuKG8uc3RhcnRzLHIpLGEubWF0Y2hlcj0oZT0+e2NvbnN0IHQ9bmV3IHMKO3JldHVybiBlLmNvbnRhaW5zLmZvckVhY2goKGU9PnQuYWRkUnVsZShlLmJlZ2luLHtydWxlOmUsdHlwZToiYmVnaW4iCn0pKSksZS50ZXJtaW5hdG9yRW5kJiZ0LmFkZFJ1bGUoZS50ZXJtaW5hdG9yRW5kLHt0eXBlOiJlbmQiCn0pLGUuaWxsZWdhbCYmdC5hZGRSdWxlKGUuaWxsZWdhbCx7dHlwZToiaWxsZWdhbCJ9KSx0fSkoYSksYX0oZSl9ZnVuY3Rpb24gcShlKXsKcmV0dXJuISFlJiYoZS5lbmRzV2l0aFBhcmVudHx8cShlLnN0YXJ0cykpfWNsYXNzIEogZXh0ZW5kcyBFcnJvcnsKY29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLm5hbWU9IkhUTUxJbmplY3Rpb25FcnJvciIsdGhpcy5odG1sPXR9fQpjb25zdCBZPW4sUT1pLGVlPVN5bWJvbCgibm9tYXRjaCIpLHRlPW49PnsKY29uc3QgaT1PYmplY3QuY3JlYXRlKG51bGwpLHM9T2JqZWN0LmNyZWF0ZShudWxsKSxvPVtdO2xldCByPSEwCjtjb25zdCBhPSJDb3VsZCBub3QgZmluZCB0aGUgbGFuZ3VhZ2UgJ3t9JywgZGlkIHlvdSBmb3JnZXQgdG8gbG9hZC9pbmNsdWRlIGEgbGFuZ3VhZ2UgbW9kdWxlPyIsbD17CmRpc2FibGVBdXRvZGV0ZWN0OiEwLG5hbWU6IlBsYWluIHRleHQiLGNvbnRhaW5zOltdfTtsZXQgcD17Cmlnbm9yZVVuZXNjYXBlZEhUTUw6ITEsdGhyb3dVbmVzY2FwZWRIVE1MOiExLG5vSGlnaGxpZ2h0UmU6L14obm8tP2hpZ2hsaWdodCkkL2ksCmxhbmd1YWdlRGV0ZWN0UmU6L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksY2xhc3NQcmVmaXg6ImhsanMtIiwKY3NzU2VsZWN0b3I6InByZSBjb2RlIixsYW5ndWFnZXM6bnVsbCxfX2VtaXR0ZXI6Y307ZnVuY3Rpb24gYihlKXsKcmV0dXJuIHAubm9IaWdobGlnaHRSZS50ZXN0KGUpfWZ1bmN0aW9uIG0oZSx0LG4pe2xldCBpPSIiLHM9IiIKOyJvYmplY3QiPT10eXBlb2YgdD8oaT1lLApuPXQuaWdub3JlSWxsZWdhbHMscz10Lmxhbmd1YWdlKTooRygiMTAuNy4wIiwiaGlnaGxpZ2h0KGxhbmcsIGNvZGUsIC4uLmFyZ3MpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0KGNvZGUsIG9wdGlvbnMpIGluc3RlYWQuXG5odHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL2lzc3Vlcy8yMjc3IiksCnM9ZSxpPXQpLHZvaWQgMD09PW4mJihuPSEwKTtjb25zdCBvPXtjb2RlOmksbGFuZ3VhZ2U6c307TigiYmVmb3JlOmhpZ2hsaWdodCIsbykKO2NvbnN0IHI9by5yZXN1bHQ/by5yZXN1bHQ6RShvLmxhbmd1YWdlLG8uY29kZSxuKQo7cmV0dXJuIHIuY29kZT1vLmNvZGUsTigiYWZ0ZXI6aGlnaGxpZ2h0IixyKSxyfWZ1bmN0aW9uIEUoZSxuLHMsbyl7CmNvbnN0IGM9T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBsKCl7aWYoIU4ua2V5d29yZHMpcmV0dXJuIHZvaWQgTS5hZGRUZXh0KFIpCjtsZXQgZT0wO04ua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXg9MDtsZXQgdD1OLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhSKSxuPSIiCjtmb3IoO3Q7KXtuKz1SLnN1YnN0cmluZyhlLHQuaW5kZXgpCjtjb25zdCBzPV8uY2FzZV9pbnNlbnNpdGl2ZT90WzBdLnRvTG93ZXJDYXNlKCk6dFswXSxvPShpPXMsTi5rZXl3b3Jkc1tpXSk7aWYobyl7CmNvbnN0W2UsaV09bwo7aWYoTS5hZGRUZXh0KG4pLG49IiIsY1tzXT0oY1tzXXx8MCkrMSxjW3NdPD03JiYoais9aSksZS5zdGFydHNXaXRoKCJfIikpbis9dFswXTtlbHNlewpjb25zdCBuPV8uY2xhc3NOYW1lQWxpYXNlc1tlXXx8ZTt1KHRbMF0sbil9fWVsc2Ugbis9dFswXQo7ZT1OLmtleXdvcmRQYXR0ZXJuUmUubGFzdEluZGV4LHQ9Ti5rZXl3b3JkUGF0dGVyblJlLmV4ZWMoUil9dmFyIGkKO24rPVIuc3Vic3RyaW5nKGUpLE0uYWRkVGV4dChuKX1mdW5jdGlvbiBnKCl7bnVsbCE9Ti5zdWJMYW5ndWFnZT8oKCk9PnsKaWYoIiI9PT1SKXJldHVybjtsZXQgZT1udWxsO2lmKCJzdHJpbmciPT10eXBlb2YgTi5zdWJMYW5ndWFnZSl7CmlmKCFpW04uc3ViTGFuZ3VhZ2VdKXJldHVybiB2b2lkIE0uYWRkVGV4dChSKQo7ZT1FKE4uc3ViTGFuZ3VhZ2UsUiwhMCxTW04uc3ViTGFuZ3VhZ2VdKSxTW04uc3ViTGFuZ3VhZ2VdPWUuX3RvcAp9ZWxzZSBlPXgoUixOLnN1Ykxhbmd1YWdlLmxlbmd0aD9OLnN1Ykxhbmd1YWdlOm51bGwpCjtOLnJlbGV2YW5jZT4wJiYoais9ZS5yZWxldmFuY2UpLE0uX19hZGRTdWJsYW5ndWFnZShlLl9lbWl0dGVyLGUubGFuZ3VhZ2UpCn0pKCk6bCgpLFI9IiJ9ZnVuY3Rpb24gdShlLHQpewoiIiE9PWUmJihNLnN0YXJ0U2NvcGUodCksTS5hZGRUZXh0KGUpLE0uZW5kU2NvcGUoKSl9ZnVuY3Rpb24gZChlLHQpe2xldCBuPTEKO2NvbnN0IGk9dC5sZW5ndGgtMTtmb3IoO248PWk7KXtpZighZS5fZW1pdFtuXSl7bisrO2NvbnRpbnVlfQpjb25zdCBpPV8uY2xhc3NOYW1lQWxpYXNlc1tlW25dXXx8ZVtuXSxzPXRbbl07aT91KHMsaSk6KFI9cyxsKCksUj0iIiksbisrfX0KZnVuY3Rpb24gaChlLHQpewpyZXR1cm4gZS5zY29wZSYmInN0cmluZyI9PXR5cGVvZiBlLnNjb3BlJiZNLm9wZW5Ob2RlKF8uY2xhc3NOYW1lQWxpYXNlc1tlLnNjb3BlXXx8ZS5zY29wZSksCmUuYmVnaW5TY29wZSYmKGUuYmVnaW5TY29wZS5fd3JhcD8odShSLF8uY2xhc3NOYW1lQWxpYXNlc1tlLmJlZ2luU2NvcGUuX3dyYXBdfHxlLmJlZ2luU2NvcGUuX3dyYXApLApSPSIiKTplLmJlZ2luU2NvcGUuX211bHRpJiYoZChlLmJlZ2luU2NvcGUsdCksUj0iIikpLE49T2JqZWN0LmNyZWF0ZShlLHtwYXJlbnQ6ewp2YWx1ZTpOfX0pLE59ZnVuY3Rpb24gZihlLG4saSl7bGV0IHM9KChlLHQpPT57Y29uc3Qgbj1lJiZlLmV4ZWModCkKO3JldHVybiBuJiYwPT09bi5pbmRleH0pKGUuZW5kUmUsaSk7aWYocyl7aWYoZVsib246ZW5kIl0pe2NvbnN0IGk9bmV3IHQoZSkKO2VbIm9uOmVuZCJdKG4saSksaS5pc01hdGNoSWdub3JlZCYmKHM9ITEpfWlmKHMpewpmb3IoO2UuZW5kc1BhcmVudCYmZS5wYXJlbnQ7KWU9ZS5wYXJlbnQ7cmV0dXJuIGV9fQppZihlLmVuZHNXaXRoUGFyZW50KXJldHVybiBmKGUucGFyZW50LG4saSl9ZnVuY3Rpb24gYihlKXsKcmV0dXJuIDA9PT1OLm1hdGNoZXIucmVnZXhJbmRleD8oUis9ZVswXSwxKTooVD0hMCwwKX1mdW5jdGlvbiBtKGUpewpjb25zdCB0PWVbMF0saT1uLnN1YnN0cmluZyhlLmluZGV4KSxzPWYoTixlLGkpO2lmKCFzKXJldHVybiBlZTtjb25zdCBvPU4KO04uZW5kU2NvcGUmJk4uZW5kU2NvcGUuX3dyYXA/KGcoKSwKdSh0LE4uZW5kU2NvcGUuX3dyYXApKTpOLmVuZFNjb3BlJiZOLmVuZFNjb3BlLl9tdWx0aT8oZygpLApkKE4uZW5kU2NvcGUsZSkpOm8uc2tpcD9SKz10OihvLnJldHVybkVuZHx8by5leGNsdWRlRW5kfHwoUis9dCksCmcoKSxvLmV4Y2x1ZGVFbmQmJihSPXQpKTtkb3sKTi5zY29wZSYmTS5jbG9zZU5vZGUoKSxOLnNraXB8fE4uc3ViTGFuZ3VhZ2V8fChqKz1OLnJlbGV2YW5jZSksTj1OLnBhcmVudAp9d2hpbGUoTiE9PXMucGFyZW50KTtyZXR1cm4gcy5zdGFydHMmJmgocy5zdGFydHMsZSksby5yZXR1cm5FbmQ/MDp0Lmxlbmd0aH0KbGV0IHc9e307ZnVuY3Rpb24geShpLG8pe2NvbnN0IGE9byYmb1swXTtpZihSKz1pLG51bGw9PWEpcmV0dXJuIGcoKSwwCjtpZigiYmVnaW4iPT09dy50eXBlJiYiZW5kIj09PW8udHlwZSYmdy5pbmRleD09PW8uaW5kZXgmJiIiPT09YSl7CmlmKFIrPW4uc2xpY2Uoby5pbmRleCxvLmluZGV4KzEpLCFyKXtjb25zdCB0PUVycm9yKGAwIHdpZHRoIG1hdGNoIHJlZ2V4ICgke2V9KWApCjt0aHJvdyB0Lmxhbmd1YWdlTmFtZT1lLHQuYmFkUnVsZT13LnJ1bGUsdH1yZXR1cm4gMX0KaWYodz1vLCJiZWdpbiI9PT1vLnR5cGUpcmV0dXJuKGU9PnsKY29uc3Qgbj1lWzBdLGk9ZS5ydWxlLHM9bmV3IHQoaSksbz1baS5fX2JlZm9yZUJlZ2luLGlbIm9uOmJlZ2luIl1dCjtmb3IoY29uc3QgdCBvZiBvKWlmKHQmJih0KGUscykscy5pc01hdGNoSWdub3JlZCkpcmV0dXJuIGIobikKO3JldHVybiBpLnNraXA/Uis9bjooaS5leGNsdWRlQmVnaW4mJihSKz1uKSwKZygpLGkucmV0dXJuQmVnaW58fGkuZXhjbHVkZUJlZ2lufHwoUj1uKSksaChpLGUpLGkucmV0dXJuQmVnaW4/MDpuLmxlbmd0aH0pKG8pCjtpZigiaWxsZWdhbCI9PT1vLnR5cGUmJiFzKXsKY29uc3QgZT1FcnJvcignSWxsZWdhbCBsZXhlbWUgIicrYSsnIiBmb3IgbW9kZSAiJysoTi5zY29wZXx8Ijx1bm5hbWVkPiIpKyciJykKO3Rocm93IGUubW9kZT1OLGV9aWYoImVuZCI9PT1vLnR5cGUpe2NvbnN0IGU9bShvKTtpZihlIT09ZWUpcmV0dXJuIGV9CmlmKCJpbGxlZ2FsIj09PW8udHlwZSYmIiI9PT1hKXJldHVybiAxCjtpZihJPjFlNSYmST4zKm8uaW5kZXgpdGhyb3cgRXJyb3IoInBvdGVudGlhbCBpbmZpbml0ZSBsb29wLCB3YXkgbW9yZSBpdGVyYXRpb25zIHRoYW4gbWF0Y2hlcyIpCjtyZXR1cm4gUis9YSxhLmxlbmd0aH1jb25zdCBfPU8oZSkKO2lmKCFfKXRocm93IFcoYS5yZXBsYWNlKCJ7fSIsZSkpLEVycm9yKCdVbmtub3duIGxhbmd1YWdlOiAiJytlKyciJykKO2NvbnN0IHY9VihfKTtsZXQgaz0iIixOPW98fHY7Y29uc3QgUz17fSxNPW5ldyBwLl9fZW1pdHRlcihwKTsoKCk9Pntjb25zdCBlPVtdCjtmb3IobGV0IHQ9Tjt0IT09Xzt0PXQucGFyZW50KXQuc2NvcGUmJmUudW5zaGlmdCh0LnNjb3BlKQo7ZS5mb3JFYWNoKChlPT5NLm9wZW5Ob2RlKGUpKSl9KSgpO2xldCBSPSIiLGo9MCxBPTAsST0wLFQ9ITE7dHJ5ewppZihfLl9fZW1pdFRva2VucylfLl9fZW1pdFRva2VucyhuLE0pO2Vsc2V7Zm9yKE4ubWF0Y2hlci5jb25zaWRlckFsbCgpOzspewpJKyssVD9UPSExOk4ubWF0Y2hlci5jb25zaWRlckFsbCgpLE4ubWF0Y2hlci5sYXN0SW5kZXg9QQo7Y29uc3QgZT1OLm1hdGNoZXIuZXhlYyhuKTtpZighZSlicmVhaztjb25zdCB0PXkobi5zdWJzdHJpbmcoQSxlLmluZGV4KSxlKQo7QT1lLmluZGV4K3R9eShuLnN1YnN0cmluZyhBKSl9cmV0dXJuIE0uZmluYWxpemUoKSxrPU0udG9IVE1MKCkse2xhbmd1YWdlOmUsCnZhbHVlOmsscmVsZXZhbmNlOmosaWxsZWdhbDohMSxfZW1pdHRlcjpNLF90b3A6Tn19Y2F0Y2godCl7CmlmKHQubWVzc2FnZSYmdC5tZXNzYWdlLmluY2x1ZGVzKCJJbGxlZ2FsIikpcmV0dXJue2xhbmd1YWdlOmUsdmFsdWU6WShuKSwKaWxsZWdhbDohMCxyZWxldmFuY2U6MCxfaWxsZWdhbEJ5OnttZXNzYWdlOnQubWVzc2FnZSxpbmRleDpBLApjb250ZXh0Om4uc2xpY2UoQS0xMDAsQSsxMDApLG1vZGU6dC5tb2RlLHJlc3VsdFNvRmFyOmt9LF9lbWl0dGVyOk19O2lmKHIpcmV0dXJuewpsYW5ndWFnZTplLHZhbHVlOlkobiksaWxsZWdhbDohMSxyZWxldmFuY2U6MCxlcnJvclJhaXNlZDp0LF9lbWl0dGVyOk0sX3RvcDpOfQo7dGhyb3cgdH19ZnVuY3Rpb24geChlLHQpe3Q9dHx8cC5sYW5ndWFnZXN8fE9iamVjdC5rZXlzKGkpO2NvbnN0IG49KGU9PnsKY29uc3QgdD17dmFsdWU6WShlKSxpbGxlZ2FsOiExLHJlbGV2YW5jZTowLF90b3A6bCxfZW1pdHRlcjpuZXcgcC5fX2VtaXR0ZXIocCl9CjtyZXR1cm4gdC5fZW1pdHRlci5hZGRUZXh0KGUpLHR9KShlKSxzPXQuZmlsdGVyKE8pLmZpbHRlcihrKS5tYXAoKHQ9PkUodCxlLCExKSkpCjtzLnVuc2hpZnQobik7Y29uc3Qgbz1zLnNvcnQoKChlLHQpPT57CmlmKGUucmVsZXZhbmNlIT09dC5yZWxldmFuY2UpcmV0dXJuIHQucmVsZXZhbmNlLWUucmVsZXZhbmNlCjtpZihlLmxhbmd1YWdlJiZ0Lmxhbmd1YWdlKXtpZihPKGUubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT10Lmxhbmd1YWdlKXJldHVybiAxCjtpZihPKHQubGFuZ3VhZ2UpLnN1cGVyc2V0T2Y9PT1lLmxhbmd1YWdlKXJldHVybi0xfXJldHVybiAwfSkpLFtyLGFdPW8sYz1yCjtyZXR1cm4gYy5zZWNvbmRCZXN0PWEsY31mdW5jdGlvbiB3KGUpe2xldCB0PW51bGw7Y29uc3Qgbj0oZT0+ewpsZXQgdD1lLmNsYXNzTmFtZSsiICI7dCs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiIKO2NvbnN0IG49cC5sYW5ndWFnZURldGVjdFJlLmV4ZWModCk7aWYobil7Y29uc3QgdD1PKG5bMV0pCjtyZXR1cm4gdHx8KFgoYS5yZXBsYWNlKCJ7fSIsblsxXSkpLApYKCJGYWxsaW5nIGJhY2sgdG8gbm8taGlnaGxpZ2h0IG1vZGUgZm9yIHRoaXMgYmxvY2suIixlKSksdD9uWzFdOiJuby1oaWdobGlnaHQifQpyZXR1cm4gdC5zcGxpdCgvXHMrLykuZmluZCgoZT0+YihlKXx8TyhlKSkpfSkoZSk7aWYoYihuKSlyZXR1cm4KO2lmKE4oImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxsYW5ndWFnZTpuCn0pLGUuZGF0YXNldC5oaWdobGlnaHRlZClyZXR1cm4gdm9pZCBjb25zb2xlLmxvZygiRWxlbWVudCBwcmV2aW91c2x5IGhpZ2hsaWdodGVkLiBUbyBoaWdobGlnaHQgYWdhaW4sIGZpcnN0IHVuc2V0IGBkYXRhc2V0LmhpZ2hsaWdodGVkYC4iLGUpCjtpZihlLmNoaWxkcmVuLmxlbmd0aD4wJiYocC5pZ25vcmVVbmVzY2FwZWRIVE1MfHwoY29uc29sZS53YXJuKCJPbmUgb2YgeW91ciBjb2RlIGJsb2NrcyBpbmNsdWRlcyB1bmVzY2FwZWQgSFRNTC4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgc2VjdXJpdHkgcmlzay4iKSwKY29uc29sZS53YXJuKCJodHRwczovL2dpdGh1Yi5jb20vaGlnaGxpZ2h0anMvaGlnaGxpZ2h0LmpzL3dpa2kvc2VjdXJpdHkiKSwKY29uc29sZS53YXJuKCJUaGUgZWxlbWVudCB3aXRoIHVuZXNjYXBlZCBIVE1MOiIpLApjb25zb2xlLndhcm4oZSkpLHAudGhyb3dVbmVzY2FwZWRIVE1MKSl0aHJvdyBuZXcgSigiT25lIG9mIHlvdXIgY29kZSBibG9ja3MgaW5jbHVkZXMgdW5lc2NhcGVkIEhUTUwuIixlLmlubmVySFRNTCkKO3Q9ZTtjb25zdCBpPXQudGV4dENvbnRlbnQsbz1uP20oaSx7bGFuZ3VhZ2U6bixpZ25vcmVJbGxlZ2FsczohMH0pOngoaSkKO2UuaW5uZXJIVE1MPW8udmFsdWUsZS5kYXRhc2V0LmhpZ2hsaWdodGVkPSJ5ZXMiLCgoZSx0LG4pPT57Y29uc3QgaT10JiZzW3RdfHxuCjtlLmNsYXNzTGlzdC5hZGQoImhsanMiKSxlLmNsYXNzTGlzdC5hZGQoImxhbmd1YWdlLSIraSkKfSkoZSxuLG8ubGFuZ3VhZ2UpLGUucmVzdWx0PXtsYW5ndWFnZTpvLmxhbmd1YWdlLHJlOm8ucmVsZXZhbmNlLApyZWxldmFuY2U6by5yZWxldmFuY2V9LG8uc2Vjb25kQmVzdCYmKGUuc2Vjb25kQmVzdD17Cmxhbmd1YWdlOm8uc2Vjb25kQmVzdC5sYW5ndWFnZSxyZWxldmFuY2U6by5zZWNvbmRCZXN0LnJlbGV2YW5jZQp9KSxOKCJhZnRlcjpoaWdobGlnaHRFbGVtZW50Iix7ZWw6ZSxyZXN1bHQ6byx0ZXh0Oml9KX1sZXQgeT0hMTtmdW5jdGlvbiBfKCl7CiJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwLmNzc1NlbGVjdG9yKS5mb3JFYWNoKHcpOnk9ITAKfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLGlbZV18fGlbc1tlXV19CmZ1bmN0aW9uIHYoZSx7bGFuZ3VhZ2VOYW1lOnR9KXsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSksZS5mb3JFYWNoKChlPT57CnNbZS50b0xvd2VyQ2FzZSgpXT10fSkpfWZ1bmN0aW9uIGsoZSl7Y29uc3QgdD1PKGUpCjtyZXR1cm4gdCYmIXQuZGlzYWJsZUF1dG9kZXRlY3R9ZnVuY3Rpb24gTihlLHQpe2NvbnN0IG49ZTtvLmZvckVhY2goKGU9PnsKZVtuXSYmZVtuXSh0KX0pKX0KInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyJiZ3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsKCgpPT57CnkmJl8oKX0pLCExKSxPYmplY3QuYXNzaWduKG4se2hpZ2hsaWdodDptLGhpZ2hsaWdodEF1dG86eCxoaWdobGlnaHRBbGw6XywKaGlnaGxpZ2h0RWxlbWVudDp3LApoaWdobGlnaHRCbG9jazplPT4oRygiMTAuNy4wIiwiaGlnaGxpZ2h0QmxvY2sgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMi4wIiksCkcoIjEwLjcuMCIsIlBsZWFzZSB1c2UgaGlnaGxpZ2h0RWxlbWVudCBub3cuIiksdyhlKSksY29uZmlndXJlOmU9PntwPVEocCxlKX0sCmluaXRIaWdobGlnaHRpbmc6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmcoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKX0sCmluaXRIaWdobGlnaHRpbmdPbkxvYWQ6KCk9PnsKXygpLEcoIjEwLjYuMCIsImluaXRIaWdobGlnaHRpbmdPbkxvYWQoKSBkZXByZWNhdGVkLiAgVXNlIGhpZ2hsaWdodEFsbCgpIG5vdy4iKQp9LHJlZ2lzdGVyTGFuZ3VhZ2U6KGUsdCk9PntsZXQgcz1udWxsO3RyeXtzPXQobil9Y2F0Y2godCl7CmlmKFcoIkxhbmd1YWdlIGRlZmluaXRpb24gZm9yICd7fScgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQuIi5yZXBsYWNlKCJ7fSIsZSkpLAohcil0aHJvdyB0O1codCkscz1sfQpzLm5hbWV8fChzLm5hbWU9ZSksaVtlXT1zLHMucmF3RGVmaW5pdGlvbj10LmJpbmQobnVsbCxuKSxzLmFsaWFzZXMmJnYocy5hbGlhc2VzLHsKbGFuZ3VhZ2VOYW1lOmV9KX0sdW5yZWdpc3Rlckxhbmd1YWdlOmU9PntkZWxldGUgaVtlXQo7Zm9yKGNvbnN0IHQgb2YgT2JqZWN0LmtleXMocykpc1t0XT09PWUmJmRlbGV0ZSBzW3RdfSwKbGlzdExhbmd1YWdlczooKT0+T2JqZWN0LmtleXMoaSksZ2V0TGFuZ3VhZ2U6TyxyZWdpc3RlckFsaWFzZXM6diwKYXV0b0RldGVjdGlvbjprLGluaGVyaXQ6USxhZGRQbHVnaW46ZT0+eyhlPT57CmVbImJlZm9yZTpoaWdobGlnaHRCbG9jayJdJiYhZVsiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImJlZm9yZTpoaWdobGlnaHRFbGVtZW50Il09dD0+ewplWyJiZWZvcmU6aGlnaGxpZ2h0QmxvY2siXShPYmplY3QuYXNzaWduKHtibG9jazp0LmVsfSx0KSkKfSksZVsiYWZ0ZXI6aGlnaGxpZ2h0QmxvY2siXSYmIWVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXSYmKGVbImFmdGVyOmhpZ2hsaWdodEVsZW1lbnQiXT10PT57CmVbImFmdGVyOmhpZ2hsaWdodEJsb2NrIl0oT2JqZWN0LmFzc2lnbih7YmxvY2s6dC5lbH0sdCkpfSl9KShlKSxvLnB1c2goZSl9LApyZW1vdmVQbHVnaW46ZT0+e2NvbnN0IHQ9by5pbmRleE9mKGUpOy0xIT09dCYmby5zcGxpY2UodCwxKX19KSxuLmRlYnVnTW9kZT0oKT0+ewpyPSExfSxuLnNhZmVNb2RlPSgpPT57cj0hMH0sbi52ZXJzaW9uU3RyaW5nPSIxMS45LjAiLG4ucmVnZXg9e2NvbmNhdDpoLApsb29rYWhlYWQ6ZyxlaXRoZXI6ZixvcHRpb25hbDpkLGFueU51bWJlck9mVGltZXM6dX0KO2Zvcihjb25zdCB0IGluIGopIm9iamVjdCI9PXR5cGVvZiBqW3RdJiZlKGpbdF0pO3JldHVybiBPYmplY3QuYXNzaWduKG4saiksbgp9LG5lPXRlKHt9KTtyZXR1cm4gbmUubmV3SW5zdGFuY2U9KCk9PnRlKHt9KSxuZX0oKQo7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSYmKG1vZHVsZS5leHBvcnRzPWhsanMpOy8qISBgY3BwYCBncmFtbWFyIGNvbXBpbGVkIGZvciBIaWdobGlnaHQuanMgMTEuOS4wICovCigoKT0+e3ZhciBlPSgoKT0+eyJ1c2Ugc3RyaWN0IjtyZXR1cm4gZT0+e2NvbnN0IHQ9ZS5yZWdleCxhPWUuQ09NTUVOVCgiLy8iLCIkIix7CmNvbnRhaW5zOlt7YmVnaW46L1xcXG4vfV0KfSksbj0iZGVjbHR5cGVcXChhdXRvXFwpIixyPSJbYS16QS1aX11cXHcqOjoiLGk9Iig/IXN0cnVjdCkoIituKyJ8Iit0Lm9wdGlvbmFsKHIpKyJbYS16QS1aX11cXHcqIit0Lm9wdGlvbmFsKCI8W148Pl0rPiIpKyIpIixzPXsKY2xhc3NOYW1lOiJ0eXBlIixiZWdpbjoiXFxiW2EtelxcZF9dKl90XFxiIn0sYz17Y2xhc3NOYW1lOiJzdHJpbmciLHZhcmlhbnRzOlt7CmJlZ2luOicodTg/fFV8TCk/IicsZW5kOiciJyxpbGxlZ2FsOiJcXG4iLGNvbnRhaW5zOltlLkJBQ0tTTEFTSF9FU0NBUEVdfSx7CmJlZ2luOiIodTg/fFV8TCk/JyhcXFxcKHhbMC05QS1GYS1mXXsyfXx1WzAtOUEtRmEtZl17NCw4fXxbMC03XXszfXxcXFMpfC4pIiwKZW5kOiInIixpbGxlZ2FsOiIuIn0sZS5FTkRfU0FNRV9BU19CRUdJTih7CmJlZ2luOi8oPzp1OD98VXxMKT9SIihbXigpXFwgXXswLDE2fSlcKC8sZW5kOi9cKShbXigpXFwgXXswLDE2fSkiL30pXX0sbz17CmNsYXNzTmFtZToibnVtYmVyIix2YXJpYW50czpbewpiZWdpbjoiWystXT8oPzooPzpbMC05XSg/Oic/WzAtOV0pKlxcLig/OlswLTldKD86Jz9bMC05XSkqKT98XFwuWzAtOV0oPzonP1swLTldKSopKD86W0VlXVsrLV0/WzAtOV0oPzonP1swLTldKSopP3xbMC05XSg/Oic/WzAtOV0pKltFZV1bKy1dP1swLTldKD86Jz9bMC05XSkqfDBbWHhdKD86WzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSooPzpcXC4oPzpbMC05QS1GYS1mXSg/Oic/WzAtOUEtRmEtZl0pKik/KT98XFwuWzAtOUEtRmEtZl0oPzonP1swLTlBLUZhLWZdKSopW1BwXVsrLV0/WzAtOV0oPzonP1swLTldKSopKD86W0ZmXSg/OjE2fDMyfDY0fDEyOCk/fChCRnxiZikxNnxbTGxdfCkiCn0sewpiZWdpbjoiWystXT9cXGIoPzowW0JiXVswMV0oPzonP1swMV0pKnwwW1h4XVswLTlBLUZhLWZdKD86Jz9bMC05QS1GYS1mXSkqfDAoPzonP1swLTddKSp8WzEtOV0oPzonP1swLTldKSopKD86W1V1XSg/OkxMP3xsbD8pfFtVdV1bWnpdP3woPzpMTD98bGw/KVtVdV0/fFtael1bVXVdfCkiCn1dLHJlbGV2YW5jZTowfSxsPXtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOi8jXHMqW2Etel0rXGIvLGVuZDovJC8sa2V5d29yZHM6ewprZXl3b3JkOiJpZiBlbHNlIGVsaWYgZW5kaWYgZGVmaW5lIHVuZGVmIHdhcm5pbmcgZXJyb3IgbGluZSBwcmFnbWEgX1ByYWdtYSBpZmRlZiBpZm5kZWYgaW5jbHVkZSIKfSxjb250YWluczpbe2JlZ2luOi9cXFxuLyxyZWxldmFuY2U6MH0sZS5pbmhlcml0KGMse2NsYXNzTmFtZToic3RyaW5nIn0pLHsKY2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOi88Lio/Pi99LGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERV19LHU9ewpjbGFzc05hbWU6InRpdGxlIixiZWdpbjp0Lm9wdGlvbmFsKHIpK2UuSURFTlRfUkUscmVsZXZhbmNlOjAKfSxkPXQub3B0aW9uYWwocikrZS5JREVOVF9SRSsiXFxzKlxcKCIscD17CnR5cGU6WyJib29sIiwiY2hhciIsImNoYXIxNl90IiwiY2hhcjMyX3QiLCJjaGFyOF90IiwiZG91YmxlIiwiZmxvYXQiLCJpbnQiLCJsb25nIiwic2hvcnQiLCJ2b2lkIiwid2NoYXJfdCIsInVuc2lnbmVkIiwic2lnbmVkIiwiY29uc3QiLCJzdGF0aWMiXSwKa2V5d29yZDpbImFsaWduYXMiLCJhbGlnbm9mIiwiYW5kIiwiYW5kX2VxIiwiYXNtIiwiYXRvbWljX2NhbmNlbCIsImF0b21pY19jb21taXQiLCJhdG9taWNfbm9leGNlcHQiLCJhdXRvIiwiYml0YW5kIiwiYml0b3IiLCJicmVhayIsImNhc2UiLCJjYXRjaCIsImNsYXNzIiwiY29fYXdhaXQiLCJjb19yZXR1cm4iLCJjb195aWVsZCIsImNvbXBsIiwiY29uY2VwdCIsImNvbnN0X2Nhc3R8MTAiLCJjb25zdGV2YWwiLCJjb25zdGV4cHIiLCJjb25zdGluaXQiLCJjb250aW51ZSIsImRlY2x0eXBlIiwiZGVmYXVsdCIsImRlbGV0ZSIsImRvIiwiZHluYW1pY19jYXN0fDEwIiwiZWxzZSIsImVudW0iLCJleHBsaWNpdCIsImV4cG9ydCIsImV4dGVybiIsImZhbHNlIiwiZmluYWwiLCJmb3IiLCJmcmllbmQiLCJnb3RvIiwiaWYiLCJpbXBvcnQiLCJpbmxpbmUiLCJtb2R1bGUiLCJtdXRhYmxlIiwibmFtZXNwYWNlIiwibmV3Iiwibm9leGNlcHQiLCJub3QiLCJub3RfZXEiLCJudWxscHRyIiwib3BlcmF0b3IiLCJvciIsIm9yX2VxIiwib3ZlcnJpZGUiLCJwcml2YXRlIiwicHJvdGVjdGVkIiwicHVibGljIiwicmVmbGV4cHIiLCJyZWdpc3RlciIsInJlaW50ZXJwcmV0X2Nhc3R8MTAiLCJyZXF1aXJlcyIsInJldHVybiIsInNpemVvZiIsInN0YXRpY19hc3NlcnQiLCJzdGF0aWNfY2FzdHwxMCIsInN0cnVjdCIsInN3aXRjaCIsInN5bmNocm9uaXplZCIsInRlbXBsYXRlIiwidGhpcyIsInRocmVhZF9sb2NhbCIsInRocm93IiwidHJhbnNhY3Rpb25fc2FmZSIsInRyYW5zYWN0aW9uX3NhZmVfZHluYW1pYyIsInRydWUiLCJ0cnkiLCJ0eXBlZGVmIiwidHlwZWlkIiwidHlwZW5hbWUiLCJ1bmlvbiIsInVzaW5nIiwidmlydHVhbCIsInZvbGF0aWxlIiwid2hpbGUiLCJ4b3IiLCJ4b3JfZXEiXSwKbGl0ZXJhbDpbIk5VTEwiLCJmYWxzZSIsIm51bGxvcHQiLCJudWxscHRyIiwidHJ1ZSJdLGJ1aWx0X2luOlsiX1ByYWdtYSJdLApfdHlwZV9oaW50czpbImFueSIsImF1dG9fcHRyIiwiYmFycmllciIsImJpbmFyeV9zZW1hcGhvcmUiLCJiaXRzZXQiLCJjb21wbGV4IiwiY29uZGl0aW9uX3ZhcmlhYmxlIiwiY29uZGl0aW9uX3ZhcmlhYmxlX2FueSIsImNvdW50aW5nX3NlbWFwaG9yZSIsImRlcXVlIiwiZmFsc2VfdHlwZSIsImZ1dHVyZSIsImltYWdpbmFyeSIsImluaXRpYWxpemVyX2xpc3QiLCJpc3RyaW5nc3RyZWFtIiwianRocmVhZCIsImxhdGNoIiwibG9ja19ndWFyZCIsIm11bHRpbWFwIiwibXVsdGlzZXQiLCJtdXRleCIsIm9wdGlvbmFsIiwib3N0cmluZ3N0cmVhbSIsInBhY2thZ2VkX3Rhc2siLCJwYWlyIiwicHJvbWlzZSIsInByaW9yaXR5X3F1ZXVlIiwicXVldWUiLCJyZWN1cnNpdmVfbXV0ZXgiLCJyZWN1cnNpdmVfdGltZWRfbXV0ZXgiLCJzY29wZWRfbG9jayIsInNldCIsInNoYXJlZF9mdXR1cmUiLCJzaGFyZWRfbG9jayIsInNoYXJlZF9tdXRleCIsInNoYXJlZF90aW1lZF9tdXRleCIsInNoYXJlZF9wdHIiLCJzdGFjayIsInN0cmluZ192aWV3Iiwic3RyaW5nc3RyZWFtIiwidGltZWRfbXV0ZXgiLCJ0aHJlYWQiLCJ0cnVlX3R5cGUiLCJ0dXBsZSIsInVuaXF1ZV9sb2NrIiwidW5pcXVlX3B0ciIsInVub3JkZXJlZF9tYXAiLCJ1bm9yZGVyZWRfbXVsdGltYXAiLCJ1bm9yZGVyZWRfbXVsdGlzZXQiLCJ1bm9yZGVyZWRfc2V0IiwidmFyaWFudCIsInZlY3RvciIsIndlYWtfcHRyIiwid3N0cmluZyIsIndzdHJpbmdfdmlldyJdCn0sXz17Y2xhc3NOYW1lOiJmdW5jdGlvbi5kaXNwYXRjaCIscmVsZXZhbmNlOjAsa2V5d29yZHM6ewpfaGludDpbImFib3J0IiwiYWJzIiwiYWNvcyIsImFwcGx5IiwiYXNfY29uc3QiLCJhc2luIiwiYXRhbiIsImF0YW4yIiwiY2FsbG9jIiwiY2VpbCIsImNlcnIiLCJjaW4iLCJjbG9nIiwiY29zIiwiY29zaCIsImNvdXQiLCJkZWNsdmFsIiwiZW5kbCIsImV4Y2hhbmdlIiwiZXhpdCIsImV4cCIsImZhYnMiLCJmbG9vciIsImZtb2QiLCJmb3J3YXJkIiwiZnByaW50ZiIsImZwdXRzIiwiZnJlZSIsImZyZXhwIiwiZnNjYW5mIiwiZnV0dXJlIiwiaW52b2tlIiwiaXNhbG51bSIsImlzYWxwaGEiLCJpc2NudHJsIiwiaXNkaWdpdCIsImlzZ3JhcGgiLCJpc2xvd2VyIiwiaXNwcmludCIsImlzcHVuY3QiLCJpc3NwYWNlIiwiaXN1cHBlciIsImlzeGRpZ2l0IiwibGFicyIsImxhdW5kZXIiLCJsZGV4cCIsImxvZyIsImxvZzEwIiwibWFrZV9wYWlyIiwibWFrZV9zaGFyZWQiLCJtYWtlX3NoYXJlZF9mb3Jfb3ZlcndyaXRlIiwibWFrZV90dXBsZSIsIm1ha2VfdW5pcXVlIiwibWFsbG9jIiwibWVtY2hyIiwibWVtY21wIiwibWVtY3B5IiwibWVtc2V0IiwibW9kZiIsIm1vdmUiLCJwb3ciLCJwcmludGYiLCJwdXRjaGFyIiwicHV0cyIsInJlYWxsb2MiLCJzY2FuZiIsInNpbiIsInNpbmgiLCJzbnByaW50ZiIsInNwcmludGYiLCJzcXJ0Iiwic3NjYW5mIiwic3RkIiwic3RkZXJyIiwic3RkaW4iLCJzdGRvdXQiLCJzdHJjYXQiLCJzdHJjaHIiLCJzdHJjbXAiLCJzdHJjcHkiLCJzdHJjc3BuIiwic3RybGVuIiwic3RybmNhdCIsInN0cm5jbXAiLCJzdHJuY3B5Iiwic3RycGJyayIsInN0cnJjaHIiLCJzdHJzcG4iLCJzdHJzdHIiLCJzd2FwIiwidGFuIiwidGFuaCIsInRlcm1pbmF0ZSIsInRvX3VuZGVybHlpbmciLCJ0b2xvd2VyIiwidG91cHBlciIsInZmcHJpbnRmIiwidmlzaXQiLCJ2cHJpbnRmIiwidnNwcmludGYiXQp9LApiZWdpbjp0LmNvbmNhdCgvXGIvLC8oPyFkZWNsdHlwZSkvLC8oPyFpZikvLC8oPyFmb3IpLywvKD8hc3dpdGNoKS8sLyg/IXdoaWxlKS8sZS5JREVOVF9SRSx0Lmxvb2thaGVhZCgvKDxbXjw+XSs+fClccypcKC8pKQp9LG09W18sbCxzLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxvLGNdLGY9e3ZhcmlhbnRzOlt7YmVnaW46Lz0vLGVuZDovOy99LHsKYmVnaW46L1woLyxlbmQ6L1wpL30se2JlZ2luS2V5d29yZHM6Im5ldyB0aHJvdyByZXR1cm4gZWxzZSIsZW5kOi87L31dLAprZXl3b3JkczpwLGNvbnRhaW5zOm0uY29uY2F0KFt7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApjb250YWluczptLmNvbmNhdChbInNlbGYiXSkscmVsZXZhbmNlOjB9XSkscmVsZXZhbmNlOjB9LGc9e2NsYXNzTmFtZToiZnVuY3Rpb24iLApiZWdpbjoiKCIraSsiW1xcKiZcXHNdKykrIitkLHJldHVybkJlZ2luOiEwLGVuZDovW3s7PV0vLGV4Y2x1ZGVFbmQ6ITAsCmtleXdvcmRzOnAsaWxsZWdhbDovW15cd1xzXComOjw+Ll0vLGNvbnRhaW5zOlt7YmVnaW46bixrZXl3b3JkczpwLHJlbGV2YW5jZTowfSx7CmJlZ2luOmQscmV0dXJuQmVnaW46ITAsY29udGFpbnM6W3VdLHJlbGV2YW5jZTowfSx7YmVnaW46Lzo6LyxyZWxldmFuY2U6MH0sewpiZWdpbjovOi8sZW5kc1dpdGhQYXJlbnQ6ITAsY29udGFpbnM6W2Msb119LHtyZWxldmFuY2U6MCxtYXRjaDovLC99LHsKY2xhc3NOYW1lOiJwYXJhbXMiLGJlZ2luOi9cKC8sZW5kOi9cKS8sa2V5d29yZHM6cCxyZWxldmFuY2U6MCwKY29udGFpbnM6W2EsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8scyx7YmVnaW46L1woLyxlbmQ6L1wpLyxrZXl3b3JkczpwLApyZWxldmFuY2U6MCxjb250YWluczpbInNlbGYiLGEsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxjLG8sc119XQp9LHMsYSxlLkNfQkxPQ0tfQ09NTUVOVF9NT0RFLGxdfTtyZXR1cm57bmFtZToiQysrIiwKYWxpYXNlczpbImNjIiwiYysrIiwiaCsrIiwiaHBwIiwiaGgiLCJoeHgiLCJjeHgiXSxrZXl3b3JkczpwLGlsbGVnYWw6IjwvIiwKY2xhc3NOYW1lQWxpYXNlczp7ImZ1bmN0aW9uLmRpc3BhdGNoIjoiYnVpbHRfaW4ifSwKY29udGFpbnM6W10uY29uY2F0KGYsZyxfLG0sW2wsewpiZWdpbjoiXFxiKGRlcXVlfGxpc3R8cXVldWV8cHJpb3JpdHlfcXVldWV8cGFpcnxzdGFja3x2ZWN0b3J8bWFwfHNldHxiaXRzZXR8bXVsdGlzZXR8bXVsdGltYXB8dW5vcmRlcmVkX21hcHx1bm9yZGVyZWRfc2V0fHVub3JkZXJlZF9tdWx0aXNldHx1bm9yZGVyZWRfbXVsdGltYXB8YXJyYXl8dHVwbGV8b3B0aW9uYWx8dmFyaWFudHxmdW5jdGlvbilcXHMqPCg/ITwpIiwKZW5kOiI+IixrZXl3b3JkczpwLGNvbnRhaW5zOlsic2VsZiIsc119LHtiZWdpbjplLklERU5UX1JFKyI6OiIsa2V5d29yZHM6cH0sewptYXRjaDpbL1xiKD86ZW51bSg/OlxzKyg/OmNsYXNzfHN0cnVjdCkpP3xjbGFzc3xzdHJ1Y3R8dW5pb24pLywvXHMrLywvXHcrL10sCmNsYXNzTmFtZTp7MToia2V5d29yZCIsMzoidGl0bGUuY2xhc3MifX1dKX19fSkoKTtobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UoImNwcCIsZSkKfSkoKTs="></script>
<script src="data:text/javascript;base64,dmFyIG1lcmdlSFRNTFBsdWdpbiA9IChmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgb3JpZ2luYWxTdHJlYW07CgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICovCiAgZnVuY3Rpb24gZXNjYXBlSFRNTCh2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlCiAgICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpCiAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKQogICAgICAucmVwbGFjZSgvIi9nLCAnJnF1b3Q7JykKICAgICAgLnJlcGxhY2UoLycvZywgJyYjeDI3OycpOwogIH0KCiAgLyogcGx1Z2luIGl0c2VsZiAqLwoKICAvKiogQHR5cGUge0hMSlNQbHVnaW59ICovCiAgY29uc3QgbWVyZ2VIVE1MUGx1Z2luID0gewogICAgLy8gcHJlc2VydmUgdGhlIG9yaWdpbmFsIEhUTUwgdG9rZW4gc3RyZWFtCiAgICAiYmVmb3JlOmhpZ2hsaWdodEVsZW1lbnQiOiAoeyBlbCB9KSA9PiB7CiAgICAgIG9yaWdpbmFsU3RyZWFtID0gbm9kZVN0cmVhbShlbCk7CiAgICB9LAogICAgLy8gbWVyZ2UgaXQgYWZ0ZXJ3YXJkcyB3aXRoIHRoZSBoaWdobGlnaHRlZCB0b2tlbiBzdHJlYW0KICAgICJhZnRlcjpoaWdobGlnaHRFbGVtZW50IjogKHsgZWwsIHJlc3VsdCwgdGV4dCB9KSA9PiB7CiAgICAgIGlmICghb3JpZ2luYWxTdHJlYW0ubGVuZ3RoKSByZXR1cm47CgogICAgICBjb25zdCByZXN1bHROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgIHJlc3VsdE5vZGUuaW5uZXJIVE1MID0gcmVzdWx0LnZhbHVlOwogICAgICByZXN1bHQudmFsdWUgPSBtZXJnZVN0cmVhbXMob3JpZ2luYWxTdHJlYW0sIG5vZGVTdHJlYW0ocmVzdWx0Tm9kZSksIHRleHQpOwogICAgICBlbC5pbm5lckhUTUwgPSByZXN1bHQudmFsdWU7CiAgICB9CiAgfTsKCiAgLyogU3RyZWFtIG1lcmdpbmcgc3VwcG9ydCBmdW5jdGlvbnMgKi8KCiAgLyoqCiAgICogQHR5cGVkZWYgRXZlbnQKICAgKiBAcHJvcGVydHkgeydzdGFydCd8J3N0b3AnfSBldmVudAogICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXQKICAgKiBAcHJvcGVydHkge05vZGV9IG5vZGUKICAgKi8KCiAgLyoqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICovCiAgZnVuY3Rpb24gdGFnKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgfQoKICAvKioKICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgKi8KICBmdW5jdGlvbiBub2RlU3RyZWFtKG5vZGUpIHsKICAgIC8qKiBAdHlwZSBFdmVudFtdICovCiAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgIChmdW5jdGlvbiBfbm9kZVN0cmVhbShub2RlLCBvZmZzZXQpIHsKICAgICAgZm9yIChsZXQgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nKSB7CiAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7CiAgICAgICAgICBvZmZzZXQgKz0gY2hpbGQubm9kZVZhbHVlLmxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7CiAgICAgICAgICByZXN1bHQucHVzaCh7CiAgICAgICAgICAgIGV2ZW50OiAnc3RhcnQnLAogICAgICAgICAgICBvZmZzZXQ6IG9mZnNldCwKICAgICAgICAgICAgbm9kZTogY2hpbGQKICAgICAgICAgIH0pOwogICAgICAgICAgb2Zmc2V0ID0gX25vZGVTdHJlYW0oY2hpbGQsIG9mZnNldCk7CiAgICAgICAgICAvLyBQcmV2ZW50IHZvaWQgZWxlbWVudHMgZnJvbSBoYXZpbmcgYW4gZW5kIHRhZyB0aGF0IHdvdWxkIGFjdHVhbGx5CiAgICAgICAgICAvLyBkb3VibGUgdGhlbSBpbiB0aGUgb3V0cHV0LiBUaGVyZSBhcmUgbW9yZSB2b2lkIGVsZW1lbnRzIGluIEhUTUwKICAgICAgICAgIC8vIGJ1dCB3ZSBsaXN0IG9ubHkgdGhvc2UgcmVhbGlzdGljYWxseSBleHBlY3RlZCBpbiBjb2RlIGRpc3BsYXkuCiAgICAgICAgICBpZiAoIXRhZyhjaGlsZCkubWF0Y2goL2JyfGhyfGltZ3xpbnB1dC8pKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsKICAgICAgICAgICAgICBldmVudDogJ3N0b3AnLAogICAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LAogICAgICAgICAgICAgIG5vZGU6IGNoaWxkCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2Zmc2V0OwogICAgfSkobm9kZSwgMCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLyoqCiAgICogQHBhcmFtIHthbnl9IG9yaWdpbmFsIC0gdGhlIG9yaWdpbmFsIHN0cmVhbQogICAqIEBwYXJhbSB7YW55fSBoaWdobGlnaHRlZCAtIHN0cmVhbSBvZiB0aGUgaGlnaGxpZ2h0ZWQgc291cmNlCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gdGhlIG9yaWdpbmFsIHNvdXJjZSBpdHNlbGYKICAgKi8KICBmdW5jdGlvbiBtZXJnZVN0cmVhbXMob3JpZ2luYWwsIGhpZ2hsaWdodGVkLCB2YWx1ZSkgewogICAgbGV0IHByb2Nlc3NlZCA9IDA7CiAgICBsZXQgcmVzdWx0ID0gJyc7CiAgICBjb25zdCBub2RlU3RhY2sgPSBbXTsKCiAgICBmdW5jdGlvbiBzZWxlY3RTdHJlYW0oKSB7CiAgICAgIGlmICghb3JpZ2luYWwubGVuZ3RoIHx8ICFoaWdobGlnaHRlZC5sZW5ndGgpIHsKICAgICAgICByZXR1cm4gb3JpZ2luYWwubGVuZ3RoID8gb3JpZ2luYWwgOiBoaWdobGlnaHRlZDsKICAgICAgfQogICAgICBpZiAob3JpZ2luYWxbMF0ub2Zmc2V0ICE9PSBoaWdobGlnaHRlZFswXS5vZmZzZXQpIHsKICAgICAgICByZXR1cm4gKG9yaWdpbmFsWzBdLm9mZnNldCA8IGhpZ2hsaWdodGVkWzBdLm9mZnNldCkgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgICB9CgogICAgICAvKgogICAgICBUbyBhdm9pZCBzdGFydGluZyB0aGUgc3RyZWFtIGp1c3QgYmVmb3JlIGl0IHNob3VsZCBzdG9wIHRoZSBvcmRlciBpcwogICAgICBlbnN1cmVkIHRoYXQgb3JpZ2luYWwgYWx3YXlzIHN0YXJ0cyBmaXJzdCBhbmQgY2xvc2VzIGxhc3Q6CgogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdGFydCcpCiAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgICBpZiAoZXZlbnQxID09ICdzdGFydCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CiAgICAgIGlmIChldmVudDEgPT0gJ3N0b3AnICYmIGV2ZW50MiA9PSAnc3RhcnQnKQogICAgICAgIHJldHVybiBvcmlnaW5hbDsKICAgICAgaWYgKGV2ZW50MSA9PSAnc3RvcCcgJiYgZXZlbnQyID09ICdzdG9wJykKICAgICAgICByZXR1cm4gaGlnaGxpZ2h0ZWQ7CgogICAgICAuLi4gd2hpY2ggaXMgY29sbGFwc2VkIHRvOgogICAgICAqLwogICAgICByZXR1cm4gaGlnaGxpZ2h0ZWRbMF0uZXZlbnQgPT09ICdzdGFydCcgPyBvcmlnaW5hbCA6IGhpZ2hsaWdodGVkOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9wZW4obm9kZSkgewogICAgICAvKiogQHBhcmFtIHtBdHRyfSBhdHRyICovCiAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhhdHRyKSB7CiAgICAgICAgcmV0dXJuICcgJyArIGF0dHIubm9kZU5hbWUgKyAnPSInICsgZXNjYXBlSFRNTChhdHRyLnZhbHVlKSArICciJzsKICAgICAgfQogICAgICAvLyBAdHMtaWdub3JlCiAgICAgIHJlc3VsdCArPSAnPCcgKyB0YWcobm9kZSkgKyBbXS5tYXAuY2FsbChub2RlLmF0dHJpYnV0ZXMsIGF0dHJpYnV0ZVN0cmluZykuam9pbignJykgKyAnPic7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUKICAgICAqLwogICAgZnVuY3Rpb24gY2xvc2Uobm9kZSkgewogICAgICByZXN1bHQgKz0gJzwvJyArIHRhZyhub2RlKSArICc+JzsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlcihldmVudCkgewogICAgICAoZXZlbnQuZXZlbnQgPT09ICdzdGFydCcgPyBvcGVuIDogY2xvc2UpKGV2ZW50Lm5vZGUpOwogICAgfQoKICAgIHdoaWxlIChvcmlnaW5hbC5sZW5ndGggfHwgaGlnaGxpZ2h0ZWQubGVuZ3RoKSB7CiAgICAgIGxldCBzdHJlYW0gPSBzZWxlY3RTdHJlYW0oKTsKICAgICAgcmVzdWx0ICs9IGVzY2FwZUhUTUwodmFsdWUuc3Vic3RyaW5nKHByb2Nlc3NlZCwgc3RyZWFtWzBdLm9mZnNldCkpOwogICAgICBwcm9jZXNzZWQgPSBzdHJlYW1bMF0ub2Zmc2V0OwogICAgICBpZiAoc3RyZWFtID09PSBvcmlnaW5hbCkgewogICAgICAgIC8qCiAgICAgICAgT24gYW55IG9wZW5pbmcgb3IgY2xvc2luZyB0YWcgb2YgdGhlIG9yaWdpbmFsIG1hcmt1cCB3ZSBmaXJzdCBjbG9zZQogICAgICAgIHRoZSBlbnRpcmUgaGlnaGxpZ2h0ZWQgbm9kZSBzdGFjaywgdGhlbiByZW5kZXIgdGhlIG9yaWdpbmFsIHRhZyBhbG9uZwogICAgICAgIHdpdGggYWxsIHRoZSBmb2xsb3dpbmcgb3JpZ2luYWwgdGFncyBhdCB0aGUgc2FtZSBvZmZzZXQgYW5kIHRoZW4KICAgICAgICByZW9wZW4gYWxsIHRoZSB0YWdzIG9uIHRoZSBoaWdobGlnaHRlZCBzdGFjay4KICAgICAgICAqLwogICAgICAgIG5vZGVTdGFjay5yZXZlcnNlKCkuZm9yRWFjaChjbG9zZSk7CiAgICAgICAgZG8gewogICAgICAgICAgcmVuZGVyKHN0cmVhbS5zcGxpY2UoMCwgMSlbMF0pOwogICAgICAgICAgc3RyZWFtID0gc2VsZWN0U3RyZWFtKCk7CiAgICAgICAgfSB3aGlsZSAoc3RyZWFtID09PSBvcmlnaW5hbCAmJiBzdHJlYW0ubGVuZ3RoICYmIHN0cmVhbVswXS5vZmZzZXQgPT09IHByb2Nlc3NlZCk7CiAgICAgICAgbm9kZVN0YWNrLnJldmVyc2UoKS5mb3JFYWNoKG9wZW4pOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW1bMF0uZXZlbnQgPT09ICdzdGFydCcpIHsKICAgICAgICAgIG5vZGVTdGFjay5wdXNoKHN0cmVhbVswXS5ub2RlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZVN0YWNrLnBvcCgpOwogICAgICAgIH0KICAgICAgICByZW5kZXIoc3RyZWFtLnNwbGljZSgwLCAxKVswXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQgKyBlc2NhcGVIVE1MKHZhbHVlLnN1YnN0cihwcm9jZXNzZWQpKTsKICB9CgogIHJldHVybiBtZXJnZUhUTUxQbHVnaW47Cgp9KCkpOw=="></script>
</head>
<body><div>
<nav><div><div>
<h1 class="hide-on-wide name-of-paper">constexpr std::generator</h1>
<div class="paper-info">
	<div><span class="key">Number:</span> P3449R0</div>
	<div><span class="key">Date:</span> <time>2024-10-15</time></div>
	<div><span class="key">Audience:</span> LEWG</div>
	<div><span class="key">Reply-to:</span> <a href="mailto:cpp@hanicka.net">Hana Dusíková</a></div>
</div>

<h2 id="table-of-contents"><a href="#table-of-contents">Table of contents</a></h2>
<ul>
  <li><a href="#quote">Why would you want to do this?</a></li>
	<li><a href="#example">Simple example</a></li>
	<li><a href="#implementation-experience">Implementation experience</a></li>
	<li><a href="#impact-on-existing-code">Impact on existing code</a></li>
	<li><a href="#intention">Intention for wording changes</a></li>
	<li><a href="#wording">Proposed changes to wording</a></li>
		<ul>
			<li><a href="#feature-test-macros">Feature test macros</a></li>
		</ul>
</ul>
</div></div></nav>
<article>
<div><div>
	<h1 class="hide-on-narrow name-of-paper">constexpr <code>std::generator</code></h1>
  <p>This paper is proposing making <code>std::generator</code> constexpr and it depends on <a href="https://wg21.link/P3367">P3367: constexpr coroutines</a>. I was told to put it into a separate paper, so here it is. I don't want this only coroutine type to lag behind language as before.</p>
  <h2 id="quote"><a href="#quote">Why would you want to do this?</a></h2>
  <p>Well, you just told me coroutines are the best way to solve some problems, so wouldn't I also want to use the Best Way at compile time? (quote from Jason Turner, co-author of <em>"constexpr all the things"</em> talk)</p>
	<h2 id="example"><a href="#example">Simple example</a></h2>
  <p>When this paper is merged into the standard, users will be able to use <code>std::generator</code>-like coroutines to generate or calculate data.</p>
  <pre><code class="language-cpp">template &lt;typename T&gt; constexpr auto fib() -> std::generator&lt;T&gt; {
    T a = 0;
    T b = 1;
    co_yield a;
    do {
        co_yield b;
        auto tmp = b;
        b += a;
        a = tmp;
    } while (true);
}

template &lt;typename T, size_t N&gt; constexpr auto calculate_fibonnaci() {
    auto res = std::array&lt;T, N&gt;{};
    std::ranges::copy(fib&lt;T&gt;() | std::views::take(N), res.begin());
    return res;
}

constexpr auto cached_fibonnaci = calculate_fibonnaci&lt;unsigned, 20&gt;();</code></pre>
	<h2 id="implementation-experience"><a href="#implementation-experience">Implementation experience</a></h2>
  <p>Partially implemented in clang available on my <a href="https://github.com/hanickadot/llvm-project/tree/P3367-constexpr-coroutines">github</a>, implementation should be ready for its presentation at Wroclaw meeting, and also will be soon available on compiler explorer (thanks Matt!).</p>
  <p>Once you have <code>constexpr</code> coroutine support, making <code>std::generator</code> constexpr is easy, just mark all function members with <code>constexpr</code>. But because there is no <code>std::generator</code> at all in libc++, I needed to implement it from scratch.</p>
	<h2 id="impact-on-existing-code"><a href="#impact-on-existing-code">Impact on existing code</a></h2>
  <p>None, this is a pure extension, it allows usage of <code>std::generator</code> during constant evaluation which wasn't possible before.</p>
	<h2 id="intention"><a href="#intention">Intention for wording changes</a></h2>
  <p>Mark every member function in [<a href="https://eel.is/c++draft/coro.generator#generator.syn">coro.generator</a>] with <code>constexpr</code>.</p>
	<h2 id="wording"><a href="#wording">Proposed changes to wording</a></h2>
	<div class="wording">
    <h2 ><a class='secnum' style='min-width:65pt'>26.8</a> Range generators <a class='abbr_ref'>[coro.generator]</a></h2><div id='coroutine.generator.overview' class='section'><h3 ><a class='secnum' href='#coroutine.generator.overview' style='min-width:80pt'>26.8.1</a> Overview <a class='abbr_ref' href='coroutine.generator.overview'>[coroutine.generator.overview]</a></h3><div class='para' id='coroutine.generator.overview-1'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.generator.overview-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16731'>#</a></div><div class='texpara'><div id='coroutine.generator.overview-1.sentence-1' class='sentence'>Class template <span class='texttt'>generator</span> presents
a view of the elements yielded by the evaluation of a coroutine<a class='hidden_link' href='#coroutine.generator.overview-1.sentence-1'>.</a></div></div></div><div class='para' id='coroutine.generator.overview-2'><div class='marginalizedparent'><a class='marginalized' href='#coroutine.generator.overview-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16735'>#</a></div><div class='texpara'><div id='coroutine.generator.overview-2.sentence-1' class='sentence'>A <span class='texttt'>generator</span> generates a sequence of elements by
repeatedly resuming the coroutine from which it was returned<a class='hidden_link' href='#coroutine.generator.overview-2.sentence-1'>.</a></div> <div id='coroutine.generator.overview-2.sentence-2' class='sentence'>Elements of the sequence are produced by the coroutine
each time a <span class='texttt'><span class='keyword'>co_<span class='shy'></span>yield</span></span> statement is evaluated<a class='hidden_link' href='#coroutine.generator.overview-2.sentence-2'>.</a></div> <div id='coroutine.generator.overview-2.sentence-3' class='sentence'>When the <span class='texttt'><span class='keyword'>co_<span class='shy'></span>yield</span></span> statement is of the form
<span class='texttt'><span class='keyword'>co_<span class='shy'></span>yield</span> elements_<span class='shy'></span>of<span class='parenthesis'>(</span>r<span class='parenthesis'>)</span></span>,
each element of the range <span class='texttt'>r</span>
is successively produced as an element of the sequence<a class='hidden_link' href='#coroutine.generator.overview-2.sentence-3'>.</a></div> <div id='coroutine.generator.overview-example-1' class='example'><div class='texpara'>[<i>Example&nbsp;<a href='#coroutine.generator.overview-example-1'>1</a></i>:&ensp;<span class='codeblock'>generator<span class='anglebracket'>&lt;</span><span class='keyword'>int</span><span class='anglebracket'>&gt;</span> ints<span class='parenthesis'>(</span><span class='keyword'>int</span> start <span class='operator'>=</span> <span class='literal'>0</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>while</span> <span class='parenthesis'>(</span><span class='literal'>true</span><span class='parenthesis'>)</span>
    <span class='keyword'>co_yield</span> start<span class='operator'>+</span><span class='operator'>+</span>;
<span class='curlybracket'>}</span>

<span class='keyword'>void</span> f<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <span class='keyword'>for</span> <span class='parenthesis'>(</span><span class='keyword'>auto</span> i <span class='operator'>:</span> ints<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>|</span> views<span class='operator'>::</span>take<span class='parenthesis'>(</span><span class='literal'>3</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>
    cout <span class='anglebracket'>&lt;</span><span class='anglebracket'>&lt;</span> i <span class='anglebracket'>&lt;</span><span class='anglebracket'>&lt;</span> <span class='literal'>' '</span>;       <span class='comment'>// prints <span class='tcode_in_codeblock'>0 1 2</span></span>
<span class='curlybracket'>}</span>
</span> —&nbsp;<i>end example</i>]</div></div></div></div></div><div id='generator.syn' class='section'><h3 ><a class='secnum' href='#generator.syn' style='min-width:80pt'>26.8.2</a> Header <span class='texttt'>&lt;generator&gt;</span> synopsis <a class='abbr_ref' href='generator.syn'>[generator.syn]</a></h3><div class='texpara'><span id='header:<generator>'><div class='marginalizedparent'><a class='itemDeclLink' href='#header:%3cgenerator%3e'>🔗</a></div><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='comment'>// <a href='#class' title='26.8.3&emsp;Class template generator'>[coro.<span class='shy'></span>generator.<span class='shy'></span>class]</a>, class template <span class='tcode_in_codeblock'>generator</span></span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Ref, <span class='keyword'>class</span> Val <span class='operator'>=</span> <span class='keyword'>void</span>, <span class='keyword'>class</span> Allocator <span class='operator'>=</span> <span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
    <span class='keyword'>class</span> generator;

  <span class='keyword'>namespace</span> pmr <span class='curlybracket'>{</span>
    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Ref, <span class='keyword'>class</span> Val <span class='operator'>=</span> <span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
      <span class='keyword'>using</span> generator <span class='operator'>=</span> std<span class='operator'>::</span>generator<span class='anglebracket'>&lt;</span>Ref, Val, polymorphic_allocator<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span>;
  <span class='curlybracket'>}</span>
<span class='curlybracket'>}</span>
</span></span></div></div><div id='class' class='section'><h3 ><a class='secnum' href='#class' style='min-width:80pt'>26.8.3</a> Class template <span class='texttt'>generator</span> <a class='abbr_ref' href='coro.generator.class'>[coro.generator.class]</a></h3><div class='texpara'><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Ref, <span class='keyword'>class</span> Val <span class='operator'>=</span> <span class='keyword'>void</span>, <span class='keyword'>class</span> Allocator <span class='operator'>=</span> <span class='keyword'>void</span><span class='anglebracket'>&gt;</span>
  <span class='keyword'>class</span> <span id='lib:generator'><a class='hidden_link' href='#lib:generator' title='26.8.3&emsp;Class template generator&emsp;[coro.generator.class]'>generator</a></span> <span class='operator'>:</span> <span class='keyword'>public</span> ranges<span class='operator'>::</span>view_interface<span class='anglebracket'>&lt;</span>generator<span class='anglebracket'>&lt;</span>Ref, Val, Allocator<span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span> <span class='curlybracket'>{</span>
  <span class='keyword'>private</span><span class='operator'>:</span>
    <span class='keyword'>using</span> <i >value</i> <span class='operator'>=</span> conditional_t<span class='anglebracket'>&lt;</span>is_void_v<span class='anglebracket'>&lt;</span>Val<span class='anglebracket'>&gt;</span>, remove_cvref_t<span class='anglebracket'>&lt;</span>Ref<span class='anglebracket'>&gt;</span>, Val<span class='anglebracket'>&gt;</span>;  <span class='comment'>// <i >exposition only</i></span>
    <span class='keyword'>using</span> <i >reference</i> <span class='operator'>=</span> conditional_t<span class='anglebracket'>&lt;</span>is_void_v<span class='anglebracket'>&lt;</span>Val<span class='anglebracket'>&gt;</span>, Ref<span class='operator'>&amp;</span><span class='operator'>&amp;</span>, Ref<span class='anglebracket'>&gt;</span>;          <span class='comment'>// <i >exposition only</i></span>

    <span class='comment'>// <a href='#iterator' title='26.8.6&emsp;Class generator&#x200b;::&#x200b;iterator'>[coro.<span class='shy'></span>generator.<span class='shy'></span>iterator]</a>, class <span class='tcode_in_codeblock'>generator&#x200b;::&#x200b;<span class='tcode_in_codeblock'><i >iterator</i></span></span></span>
    <span class='keyword'>class</span> <i >iterator</i>;                                                     <span class='comment'>// <i >exposition only</i></span>

  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class='keyword'>using</span> yielded <span class='operator'>=</span>
      conditional_t<span class='anglebracket'>&lt;</span>is_reference_v<span class='anglebracket'>&lt;</span><i >reference</i><span class='anglebracket'>&gt;</span>, <i >reference</i>, <span class='keyword'>const</span> <i >reference</i><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span>;

    <span class='comment'>// <a href='#promise' title='26.8.5&emsp;Class generator&#x200b;::&#x200b;promise_&shy;type'>[coro.<span class='shy'></span>generator.<span class='shy'></span>promise]</a>, class <span class='tcode_in_codeblock'>generator&#x200b;::&#x200b;promise_<span class='shy'></span>type</span></span>
    <span class='keyword'>class</span> promise_type;

    <span class="added keyword">constexpr</span> generator<span class='parenthesis'>(</span><span class='keyword'>const</span> generator<span class='operator'>&amp;</span><span class='parenthesis'>)</span> <span class='operator'>=</span> <span class='keyword'>delete</span>;
    <span class="added keyword">constexpr</span> generator<span class='parenthesis'>(</span>generator<span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> <span class='operator'>~</span>generator<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;

    <span class="added keyword">constexpr</span> generator<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>generator other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> <i >iterator</i> begin<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> default_sentinel_t end<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    coroutine_handle<span class='anglebracket'>&lt;</span>promise_type<span class='anglebracket'>&gt;</span> <i >coroutine_</i> <span class='operator'>=</span> <span class='literal'>nullptr</span>;  <span class='comment'>// <i >exposition only</i></span>
    unique_ptr<span class='anglebracket'>&lt;</span>stack<span class='anglebracket'>&lt;</span>coroutine_handle<span class='anglebracket'>&lt;</span><span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span><span class='anglebracket'>&gt;</span> <i >active_</i>;        <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></div><div class='para' id='class-1'><div class='marginalizedparent'><a class='marginalized' href='#class-1'>1</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16811'>#</a></div><div class='texpara'><div id='class-1.sentence-1' class='sentence'><i >Mandates</i>: <ul class='itemize'><li id='class-1.1'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#class-1.1'>(1.1)</a></div><div class='texpara'><div id='class-1.1.sentence-1' class='sentence'>If <span class='texttt'>Allocator</span> is not <span class='texttt'><span class='keyword'>void</span></span>,
<span class='texttt'>allocator_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>Allocator<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>pointer</span> is a pointer type<a class='hidden_link' href='#class-1.1.sentence-1'>.</a></div></div></li><li id='class-1.2'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#class-1.2'>(1.2)</a></div><div class='texpara'><div id='class-1.2.sentence-1' class='sentence'><span class='texttt'><i >value</i></span> is a cv-unqualified object type<a class='hidden_link' href='#class-1.2.sentence-1'>.</a></div></div></li><li id='class-1.3'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#class-1.3'>(1.3)</a></div><div class='texpara'><div id='class-1.3.sentence-1' class='sentence'><span class='texttt'><i >reference</i></span> is either a reference type, or
a cv-unqualified object type that models <a href='concept.copyconstructible#concept:copy_constructible' title='18.4.14&emsp;Concept copy_&shy;constructible&emsp;[concept.copyconstructible]'><span id='conceptref:copy_constructible'><span class='texttt'>copy_<span class='shy'></span>constructible</span></span></a><a class='hidden_link' href='#class-1.3.sentence-1'>.</a></div></div></li><li id='class-1.4'><div class='marginalizedparent' style='left:-27mm'><a class='marginalized' href='#class-1.4'>(1.4)</a></div><div class='texpara'><div id='class-1.4.sentence-1' class='sentence'>Let <span class='texttt'>RRef</span> denote <span class='texttt'>remove_<span class='shy'></span>reference_<span class='shy'></span>t<span class='anglebracket'>&lt;</span><span class='texttt'><i >reference</i></span><span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span><span class='operator'>&amp;</span></span>
if <span class='texttt'><i >reference</i></span> is a reference type,
and <span class='texttt'><i >reference</i></span> otherwise<a class='hidden_link' href='#class-1.4.sentence-1'>.</a></div> <div id='class-1.4.sentence-2' class='sentence'>Each of:
<ul class='itemize'><li id='class-1.4.1'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#class-1.4.1'>(1.4.1)</a></div><span class='texttt'><a href='concept.commonref#concept:common_reference_with' title='18.4.5&emsp;Concept common_&shy;reference_&shy;with&emsp;[concept.commonref]'><span id='conceptref:common_reference_with'><span class='texttt'>common_<span class='shy'></span>reference_<span class='shy'></span>with</span></span></a><span class='anglebracket'>&lt;</span><span class='texttt'><i >reference</i></span><span class='operator'>&amp;</span><span class='operator'>&amp;</span>, <span class='texttt'><i >value</i></span><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span></span>,</li><li id='class-1.4.2'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#class-1.4.2'>(1.4.2)</a></div><span class='texttt'><a href='concept.commonref#concept:common_reference_with' title='18.4.5&emsp;Concept common_&shy;reference_&shy;with&emsp;[concept.commonref]'><span id='conceptref:common_reference_with_'><span class='texttt'>common_<span class='shy'></span>reference_<span class='shy'></span>with</span></span></a><span class='anglebracket'>&lt;</span><span class='texttt'><i >reference</i></span><span class='operator'>&amp;</span><span class='operator'>&amp;</span>, RRef<span class='operator'>&amp;</span><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span></span>, and</li><li id='class-1.4.3'><div class='marginalizedparent' style='left:-36mm'><a class='marginalized' href='#class-1.4.3'>(1.4.3)</a></div><span class='texttt'><a href='concept.commonref#concept:common_reference_with' title='18.4.5&emsp;Concept common_&shy;reference_&shy;with&emsp;[concept.commonref]'><span id='conceptref:common_reference_with__'><span class='texttt'>common_<span class='shy'></span>reference_<span class='shy'></span>with</span></span></a><span class='anglebracket'>&lt;</span>RRef<span class='operator'>&amp;</span><span class='operator'>&amp;</span>, <span class='keyword'>const</span> <span class='texttt'><i >value</i></span><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span></span></li></ul>
is modeled<a class='hidden_link' href='#class-1.4.sentence-2'>.</a></div> <div id='class-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#class-note-1'>1</a></i>:&ensp;<div id='class-1.4.sentence-3' class='sentence'>These requirements ensure the exposition-only <span class='texttt'><i >iterator</i></span> type
can model <a href='iterator.concept.readable#concept:indirectly_readable' title='25.3.4.2&emsp;Concept indirectly_&shy;readable&emsp;[iterator.concept.readable]'><span id='conceptref:indirectly_readable'><span class='texttt'>indirectly_<span class='shy'></span>readable</span></span></a> and thus <a href='iterator.concept.input#concept:input_iterator' title='25.3.4.9&emsp;Concept input_&shy;iterator&emsp;[iterator.concept.input]'><span id='conceptref:input_iterator'><span class='texttt'>input_<span class='shy'></span>iterator</span></span></a><a class='hidden_link' href='#class-1.4.sentence-3'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></li></ul></div></div></div><div class='para' id='class-2'><div class='marginalizedparent'><a class='marginalized' href='#class-2'>2</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16839'>#</a></div><div class='texpara'><div id='class-2.sentence-1' class='sentence'>If <span class='texttt'>Allocator</span> is not <span class='texttt'><span class='keyword'>void</span></span>,
it shall meet the <i >Cpp17Allocator</i> requirements<a class='hidden_link' href='#class-2.sentence-1'>.</a></div></div></div><div class='para' id='class-3'><div class='marginalizedparent'><a class='marginalized' href='#class-3'>3</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16843'>#</a></div><div class='texpara'><div id='class-3.sentence-1' class='sentence'>Specializations of <span class='texttt'>generator</span> model
<a href='range.view#concept:view' title='26.4.4&emsp;Views&emsp;[range.view]'><span id='conceptref:view'><span class='texttt'>view</span></span></a> and <a href='range.refinements#concept:input_range' title='26.4.5&emsp;Other range refinements&emsp;[range.refinements]'><span id='conceptref:input_range'><span class='texttt'>input_<span class='shy'></span>range</span></span></a><a class='hidden_link' href='#class-3.sentence-1'>.</a></div></div></div><div class='para' id='class-4'><div class='marginalizedparent'><a class='marginalized' href='#class-4'>4</a></div><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16847'>#</a></div><div class='texpara'><div id='class-4.sentence-1' class='sentence'>The behavior of a program that adds a specialization
for <span class='texttt'>generator</span> is undefined<a class='hidden_link' href='#class-4.sentence-1'>.</a></div></div></div></div><div id='members' class='section'><h3 ><a class='secnum' href='#members' style='min-width:80pt'>26.8.4</a> Members <a class='abbr_ref' href='coro.generator.members'>[coro.generator.members]</a></h3><div class='texpara'><div id='lib:generator,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:generator,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> generator<span class='parenthesis'>(</span>generator<span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='members-1'><div class='marginalizedparent'><a class='marginalized' href='#members-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16859'>#</a></div><div class='texpara'><div id='members-1.sentence-1' class='sentence'><i >Effects</i>: Initializes <span class='texttt'><i >coroutine_<span class='shy'></span></i></span> with
<span class='texttt'>exchange<span class='parenthesis'>(</span>other<span class='operator'>.</span><span class='texttt'><i >coroutine_<span class='shy'></span></i></span>, <span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span></span> and
<span class='texttt'><i >active_<span class='shy'></span></i></span> with
<span class='texttt'>exchange<span class='parenthesis'>(</span>&#x200b;other<span class='operator'>.</span>active_<span class='shy'></span>, <span class='literal'>nullptr</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#members-1.sentence-1'>.</a></div></div></div></div><div class='para nonNormativeOnly' id='members-2'><div class='marginalizedparent'><a class='marginalized' href='#members-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16866'>#</a></div><div class='texpara'><div id='members-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#members-note-1'>1</a></i>:&ensp;<div id='members-2.sentence-1' class='sentence'>Iterators previously obtained from <span class='texttt'>other</span> are not invalidated;
they become iterators into <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#members-2.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div><div class='texpara'><div id='lib:generator,destructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:generator,destructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='operator'>~</span>generator<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
</code></div></div></div><div class='para' id='members-3'><div class='marginalizedparent'><a class='marginalized' href='#members-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16879'>#</a></div><div class='texpara'><div id='members-3.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
<span class='codeblock'><span class='keyword'>if</span> <span class='parenthesis'>(</span><i >coroutine_</i><span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
  <i >coroutine_</i><span class='operator'>.</span>destroy<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
<span class='curlybracket'>}</span>
</span></div></div></div></div><div class='para nonNormativeOnly' id='members-4'><div class='marginalizedparent'><a class='marginalized' href='#members-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16888'>#</a></div><div class='texpara'><div id='members-note-2' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#members-note-2'>2</a></i>:&ensp;<div id='members-4.sentence-1' class='sentence'>Ownership of recursively yielded generators
is held in awaitable objects
in the coroutine frame of the yielding generator,
so destroying the root generator
effectively destroys the entire stack of yielded generators<a class='hidden_link' href='#members-4.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div><div class='texpara'><div id='lib:generator,operator='><div id='lib:operator=,generator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator=,generator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> generator<span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span>generator other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='members-5'><div class='marginalizedparent'><a class='marginalized' href='#members-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16904'>#</a></div><div class='texpara'><div id='members-5.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
<span class='codeblock'>swap<span class='parenthesis'>(</span><i >coroutine_</i>, other<span class='operator'>.</span><i >coroutine_</i><span class='parenthesis'>)</span>;
swap<span class='parenthesis'>(</span><i >active_</i>, other<span class='operator'>.</span><i >active_</i><span class='parenthesis'>)</span>;
</span></div></div></div></div><div class='para' id='members-6'><div class='marginalizedparent'><a class='marginalized' href='#members-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16912'>#</a></div><div class='texpara'><div id='members-6.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#members-6.sentence-1'>.</a></div></div></div></div><div class='para nonNormativeOnly' id='members-7'><div class='marginalizedparent'><a class='marginalized' href='#members-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16916'>#</a></div><div class='texpara'><div id='members-note-3' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#members-note-3'>3</a></i>:&ensp;<div id='members-7.sentence-1' class='sentence'>Iterators previously obtained from <span class='texttt'>other</span> are not invalidated;
they become iterators into <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#members-7.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div><div class='texpara'><div id='lib:generator,begin'><div id='lib:begin,generator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:begin,generator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='texttt'><i >iterator</i></span> begin<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='members-8'><div class='marginalizedparent'><a class='marginalized' href='#members-8'>8</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16929'>#</a></div><div class='texpara'><div id='members-8.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'><i >coroutine_<span class='shy'></span></i></span> refers to a coroutine
suspended at its initial suspend point (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>)<a class='hidden_link' href='#members-8.sentence-1'>.</a></div></div></div></div><div class='para' id='members-9'><div class='marginalizedparent'><a class='marginalized' href='#members-9'>9</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16934'>#</a></div><div class='texpara'><div id='members-9.sentence-1' class='sentence'><i >Effects</i>: Pushes <span class='texttt'><i >coroutine_<span class='shy'></span></i></span> into <span class='texttt'><span class='operator'>*</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>,
then evaluates <span class='texttt'><span class='texttt'><i >coroutine_<span class='shy'></span></i></span><span class='operator'>.</span>resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#members-9.sentence-1'>.</a></div></div></div></div><div class='para' id='members-10'><div class='marginalizedparent'><a class='marginalized' href='#members-10'>10</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16939'>#</a></div><div class='texpara'><div id='members-10.sentence-1' class='sentence'><i >Returns</i>: An <span class='texttt'><i >iterator</i></span> object
whose member <span class='texttt'><i >coroutine_<span class='shy'></span></i></span>
refers to the same coroutine as does
<span class='texttt'><i >coroutine_<span class='shy'></span></i></span><a class='hidden_link' href='#members-10.sentence-1'>.</a></div></div></div></div><div class='para nonNormativeOnly' id='members-11'><div class='marginalizedparent'><a class='marginalized' href='#members-11'>11</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16946'>#</a></div><div class='texpara'><div id='members-note-4' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#members-note-4'>4</a></i>:&ensp;<div id='members-11.sentence-1' class='sentence'>A program that calls <span class='texttt'>begin</span> more than once on the same generator
has undefined behavior<a class='hidden_link' href='#members-11.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div><div class='texpara'><div id='lib:generator,end'><div id='lib:end,generator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:end,generator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> default_sentinel_t end<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='members-12'><div class='marginalizedparent'><a class='marginalized' href='#members-12'>12</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L16959'>#</a></div><div class='texpara'><div id='members-12.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'>default_<span class='shy'></span>sentinel</span><a class='hidden_link' href='#members-12.sentence-1'>.</a></div></div></div></div></div><div id='promise' class='section'><h3 ><a class='secnum' href='#promise' style='min-width:80pt'>26.8.5</a> Class <span class='texttt'>generator&#x200b;::&#x200b;promise_<span class='shy'></span>type</span> <a class='abbr_ref' href='coro.generator.promise'>[coro.generator.promise]</a></h3><div class='texpara'><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Ref, <span class='keyword'>class</span> Val, <span class='keyword'>class</span> Allocator<span class='anglebracket'>&gt;</span>
  <span class='keyword'>class</span> generator<span class='anglebracket'>&lt;</span>Ref, Val, Allocator<span class='anglebracket'>&gt;</span><span class='operator'>::</span>promise_type <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class="added keyword">constexpr</span> generator get_return_object<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> suspend_always initial_suspend<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span> <span class='keyword'>return</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>; <span class='curlybracket'>}</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> final_suspend<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> suspend_always yield_value<span class='parenthesis'>(</span>yielded val<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span><span class='keyword'>const</span> remove_reference_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> lval<span class='parenthesis'>)</span>
      <span class='keyword'>requires</span> is_rvalue_reference_v<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span>
        <a href='concept.constructible#concept:constructible_from' title='18.4.11&emsp;Concept constructible_&shy;from&emsp;[concept.constructible]'><span id='conceptref:constructible_from'><span class='tcode_in_codeblock'>constructible_<span class='shy'></span>from</span></span></a><span class='anglebracket'>&lt;</span>remove_cvref_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span>, <span class='keyword'>const</span> remove_reference_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> R2, <span class='keyword'>class</span> V2, <span class='keyword'>class</span> Alloc2, <span class='keyword'>class</span> Unused<span class='anglebracket'>&gt;</span>
      <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as'><span class='tcode_in_codeblock'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> generator<span class='anglebracket'>&lt;</span>R2, V2, Alloc2<span class='anglebracket'>&gt;</span><span class='operator'>::</span>yielded, yielded<span class='anglebracket'>&gt;</span>
        <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span>ranges<span class='operator'>::</span>elements_of<span class='anglebracket'>&lt;</span>generator<span class='anglebracket'>&lt;</span>R2, V2, Alloc2<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span><span class='operator'>&amp;</span>, Unused<span class='anglebracket'>&gt;</span> g<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span>ranges<span class='operator'>::</span><a href='range.refinements#concept:input_range' title='26.4.5&emsp;Other range refinements&emsp;[range.refinements]'><span id='conceptref:input_range_'><span class='tcode_in_codeblock'>input_<span class='shy'></span>range</span></span></a> R, <span class='keyword'>class</span> Alloc<span class='anglebracket'>&gt;</span>
      <span class='keyword'>requires</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to'><span class='tcode_in_codeblock'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span>ranges<span class='operator'>::</span>range_reference_t<span class='anglebracket'>&lt;</span>R<span class='anglebracket'>&gt;</span>, yielded<span class='anglebracket'>&gt;</span>
        <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span>ranges<span class='operator'>::</span>elements_of<span class='anglebracket'>&lt;</span>R, Alloc<span class='anglebracket'>&gt;</span> r<span class='parenthesis'>)</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>void</span> await_transform<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='operator'>=</span> <span class='keyword'>delete</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>void</span> return_void<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span> <span class='curlybracket'>{</span><span class='curlybracket'>}</span>
    <span class="added keyword">constexpr</span> <span class='keyword'>void</span> unhandled_exception<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size<span class='parenthesis'>)</span>
      <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as_'><span class='tcode_in_codeblock'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.default.init#concept:default_initializable' title='18.4.12&emsp;Concept default_&shy;initializable&emsp;[concept.default.init]'><span id='conceptref:default_initializable'><span class='tcode_in_codeblock'>default_<span class='shy'></span>initializable</span></span></a><span class='anglebracket'>&lt;</span>Allocator<span class='anglebracket'>&gt;</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Alloc, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Args<span class='anglebracket'>&gt;</span>
      <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as__'><span class='tcode_in_codeblock'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to_'><span class='tcode_in_codeblock'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span>, Allocator<span class='anglebracket'>&gt;</span>
        <span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size, allocator_arg_t, <span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span> alloc, <span class='keyword'>const</span> Args<span class='operator'>&amp;</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='parenthesis'>)</span>;

    <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> This, <span class='keyword'>class</span> Alloc, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Args<span class='anglebracket'>&gt;</span>
      <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as___'><span class='tcode_in_codeblock'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to__'><span class='tcode_in_codeblock'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span>, Allocator<span class='anglebracket'>&gt;</span>
        <span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size, <span class='keyword'>const</span> This<span class='operator'>&amp;</span>, allocator_arg_t, <span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span> alloc,
                           <span class='keyword'>const</span> Args<span class='operator'>&amp;</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='parenthesis'>)</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span> <span class='keyword'>delete</span><span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> pointer, size_t size<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    add_pointer_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span> <i >value_</i> <span class='operator'>=</span> <span class='literal'>nullptr</span>;    <span class='comment'>// <i >exposition only</i></span>
    exception_ptr <i >except_</i>;                      <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></div><div class='texpara'><div id='lib:generator::promise_type,get_return_object'><div id='lib:get_return_object,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:get_return_object,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> generator get_return_object<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='promise-1'><div class='marginalizedparent'><a class='marginalized' href='#promise-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17022'>#</a></div><div class='texpara'><div id='promise-1.sentence-1' class='sentence'><i >Returns</i>: A <span class='texttt'>generator</span> object whose member <span class='texttt'><i >coroutine_<span class='shy'></span></i></span>
is <span class='texttt'>coroutine_<span class='shy'></span>handle<span class='anglebracket'>&lt;</span>promise_<span class='shy'></span>type<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>&#x200b;from_<span class='shy'></span>promise<span class='parenthesis'>(</span><span class='operator'>*</span><span class='keyword'>this</span><span class='parenthesis'>)</span></span>,
and whose member <span class='texttt'><i >active_<span class='shy'></span></i></span> points to an empty stack<a class='hidden_link' href='#promise-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,final_suspend'><div id='lib:final_suspend,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:final_suspend,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class='keyword'><span class="added keyword">constexpr</span> auto</span> final_suspend<span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='promise-2'><div class='marginalizedparent'><a class='marginalized' href='#promise-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17035'>#</a></div><div class='texpara'><div id='promise-2.sentence-1' class='sentence'><i >Preconditions</i>: A handle referring to the coroutine
whose promise object is <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span>
is at the top of <span class='texttt'><span class='operator'>*</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>
of some <span class='texttt'>generator</span> object <span class='texttt'>x</span><a class='hidden_link' href='#promise-2.sentence-1'>.</a></div> <div id='promise-2.sentence-2' class='sentence'>This function is called by that coroutine
upon reaching its final suspend point (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>)<a class='hidden_link' href='#promise-2.sentence-2'>.</a></div></div></div></div><div class='para' id='promise-3'><div class='marginalizedparent'><a class='marginalized' href='#promise-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17044'>#</a></div><div class='texpara'><div id='promise-3.sentence-1' class='sentence'><i >Returns</i>: An awaitable object of unspecified type (<a href='expr.await' title='7.6.2.4&emsp;Await'>[expr.<span class='shy'></span>await]</a>)
whose member functions arrange for the
calling coroutine to be suspended,
pop the coroutine handle
from the top of <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>,
and resume execution of the coroutine referred to by
<span class='texttt'>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span><span class='operator'>-</span><span class='anglebracket'>&gt;</span>top<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span>
if <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span> is not empty<a class='hidden_link' href='#promise-3.sentence-1'>.</a></div> <div id='promise-3.sentence-2' class='sentence'>If it is empty, control flow returns to the
current coroutine caller or resumer (<a href='dcl.fct.def.coroutine' title='9.5.4&emsp;Coroutine definitions'>[dcl.<span class='shy'></span>fct.<span class='shy'></span>def.<span class='shy'></span>coroutine]</a>)<a class='hidden_link' href='#promise-3.sentence-2'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,yield_value'><div id='lib:yield_value,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:yield_value,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> suspend_always yield_value<span class='parenthesis'>(</span>yielded val<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='promise-4'><div class='marginalizedparent'><a class='marginalized' href='#promise-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17064'>#</a></div><div class='texpara'><div id='promise-4.sentence-1' class='sentence'><i >Effects</i>: Equivalent to <span class='texttt'><span class='texttt'><i >value_<span class='shy'></span></i></span> <span class='operator'>=</span> addressof<span class='parenthesis'>(</span>val<span class='parenthesis'>)</span></span><a class='hidden_link' href='#promise-4.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-5'><div class='marginalizedparent'><a class='marginalized' href='#promise-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17068'>#</a></div><div class='texpara'><div id='promise-5.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='curlybracket'>{</span><span class='curlybracket'>}</span></span><a class='hidden_link' href='#promise-5.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,yield_value_'><div id='lib:yield_value,generator::promise_type_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:yield_value,generator::promise_type_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span><span class='keyword'>const</span> remove_reference_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span> lval<span class='parenthesis'>)</span>
  <span class='keyword'>requires</span> is_rvalue_reference_v<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span> <span class='operator'>&amp;</span><span class='operator'>&amp;</span>
    <a href='concept.constructible#concept:constructible_from' title='18.4.11&emsp;Concept constructible_&shy;from&emsp;[concept.constructible]'><span id='conceptref:constructible_from_'><span class='texttt'>constructible_<span class='shy'></span>from</span></span></a><span class='anglebracket'>&lt;</span>remove_cvref_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span>, <span class='keyword'>const</span> remove_reference_t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span><span class='anglebracket'>&gt;</span>;
</code></div></div></div></div><div class='para' id='promise-6'><div class='marginalizedparent'><a class='marginalized' href='#promise-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17081'>#</a></div><div class='texpara'><div id='promise-6.sentence-1' class='sentence'><i >Preconditions</i>: A handle referring to the coroutine
whose promise object is <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span>
is at the top of <span class='texttt'><span class='operator'>*</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>
of some <span class='texttt'>generator</span> object<a class='hidden_link' href='#promise-6.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-7'><div class='marginalizedparent'><a class='marginalized' href='#promise-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17088'>#</a></div><div class='texpara'><div id='promise-7.sentence-1' class='sentence'><i >Returns</i>: An awaitable object of an unspecified type (<a href='expr.await' title='7.6.2.4&emsp;Await'>[expr.<span class='shy'></span>await]</a>)
that stores an object of type <span class='texttt'>remove_<span class='shy'></span>cvref_<span class='shy'></span>t<span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span></span>
direct-non-list-initialized with <span class='texttt'>lval</span>,
whose member functions arrange for
<span class='texttt'><i >value_<span class='shy'></span></i></span> to point to that stored object
and then suspend the coroutine<a class='hidden_link' href='#promise-7.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-8'><div class='marginalizedparent'><a class='marginalized' href='#promise-8'>8</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17097'>#</a></div><div class='texpara'><div id='promise-8.sentence-1' class='sentence'><i >Throws</i>: Any exception thrown by the initialization of the stored object<a class='hidden_link' href='#promise-8.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-9'><div class='marginalizedparent'><a class='marginalized' href='#promise-9'>9</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17101'>#</a></div><div class='texpara'><div id='promise-9.sentence-1' class='sentence'><i >Remarks</i>: A <a href='expr.yield#nt:yield-expression' title='7.6.17&emsp;Yielding a value&emsp;[expr.yield]'><span id='ntref:yield-expression'><span class='textsf'><i >yield-expression</i></span></span></a> that calls this function
has type <span class='texttt'><span class='keyword'>void</span></span> (<a href='expr.yield' title='7.6.17&emsp;Yielding a value'>[expr.<span class='shy'></span>yield]</a>)<a class='hidden_link' href='#promise-9.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,yield_value__'><div id='lib:yield_value,generator::promise_type__'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:yield_value,generator::promise_type__'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> R2, <span class='keyword'>class</span> V2, <span class='keyword'>class</span> Alloc2, <span class='keyword'>class</span> Unused<span class='anglebracket'>&gt;</span>
  <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as____'><span class='texttt'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>typename</span> generator<span class='anglebracket'>&lt;</span>R2, V2, Alloc2<span class='anglebracket'>&gt;</span><span class='operator'>::</span>yielded, yielded<span class='anglebracket'>&gt;</span>
  <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span>ranges<span class='operator'>::</span>elements_of<span class='anglebracket'>&lt;</span>generator<span class='anglebracket'>&lt;</span>R2, V2, Alloc2<span class='anglebracket'>&gt;</span><span class='operator'>&amp;</span><span class='operator'>&amp;</span>, Unused<span class='anglebracket'>&gt;</span> g<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='promise-10'><div class='marginalizedparent'><a class='marginalized' href='#promise-10'>10</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17115'>#</a></div><div class='texpara'><div id='promise-10.sentence-1' class='sentence'><i >Preconditions</i>: A handle referring to the coroutine
whose promise object is <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span>
is at the top of <span class='texttt'><span class='operator'>*</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>
of some <span class='texttt'>generator</span> object <span class='texttt'>x</span><a class='hidden_link' href='#promise-10.sentence-1'>.</a></div> <div id='promise-10.sentence-2' class='sentence'>The coroutine referred to by
<span class='texttt'>g<span class='operator'>.</span>range<span class='operator'>.</span><span class='texttt'><i >coroutine_<span class='shy'></span></i></span></span>
is suspended at its initial suspend point<a class='hidden_link' href='#promise-10.sentence-2'>.</a></div></div></div></div><div class='para' id='promise-11'><div class='marginalizedparent'><a class='marginalized' href='#promise-11'>11</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17125'>#</a></div><div class='texpara'><div id='promise-11.sentence-1' class='sentence'><i >Returns</i>: An awaitable object of an unspecified type (<a href='expr.await' title='7.6.2.4&emsp;Await'>[expr.<span class='shy'></span>await]</a>)
into which <span class='texttt'>g<span class='operator'>.</span>range</span> is moved,
whose member <span class='texttt'>await_<span class='shy'></span>ready</span> returns <span class='texttt'><span class='literal'>false</span></span>,
whose member <span class='texttt'>await_<span class='shy'></span>suspend</span>
pushes <span class='texttt'>g<span class='operator'>.</span>range<span class='operator'>.</span></span><span class='mbox'><span class='texttt'><i >coroutine_<span class='shy'></span></i></span></span>
into <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>
and resumes execution of the coroutine referred to
by <span class='texttt'>g<span class='operator'>.</span>range<span class='operator'>.</span>&#x200b;<span class='texttt'><i >coroutine_<span class='shy'></span></i></span></span>, and
whose member <span class='texttt'>await_<span class='shy'></span>resume</span> evaluates
<span class='texttt'>rethrow_<span class='shy'></span>exception<span class='parenthesis'>(</span><span class='texttt'><i >except_<span class='shy'></span></i></span><span class='parenthesis'>)</span></span>
if <span class='texttt'><span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='texttt'><i >except_<span class='shy'></span></i></span><span class='parenthesis'>)</span></span> is <span class='texttt'><span class='literal'>true</span></span><a class='hidden_link' href='#promise-11.sentence-1'>.</a></div> <div id='promise-11.sentence-2' class='sentence'>If <span class='texttt'><span class='keyword'>bool</span><span class='parenthesis'>(</span><span class='texttt'><i >except_<span class='shy'></span></i></span><span class='parenthesis'>)</span></span> is <span class='texttt'><span class='literal'>false</span></span>,
the <span class='texttt'>await_<span class='shy'></span>resume</span> member has no effects<a class='hidden_link' href='#promise-11.sentence-2'>.</a></div></div></div></div><div class='para' id='promise-12'><div class='marginalizedparent'><a class='marginalized' href='#promise-12'>12</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17142'>#</a></div><div class='texpara'><div id='promise-12.sentence-1' class='sentence'><i >Remarks</i>: A <a href='expr.yield#nt:yield-expression' title='7.6.17&emsp;Yielding a value&emsp;[expr.yield]'><span id='ntref:yield-expression_'><span class='textsf'><i >yield-expression</i></span></span></a> that calls this function
has type <span class='texttt'><span class='keyword'>void</span></span> (<a href='expr.yield' title='7.6.17&emsp;Yielding a value'>[expr.<span class='shy'></span>yield]</a>)<a class='hidden_link' href='#promise-12.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,yield_value___'><div id='lib:yield_value,generator::promise_type___'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:yield_value,generator::promise_type___'>🔗</a></div><code class='itemdeclcode'><span class='keyword'>template</span><span class='anglebracket'>&lt;</span>ranges<span class='operator'>::</span><a href='range.refinements#concept:input_range' title='26.4.5&emsp;Other range refinements&emsp;[range.refinements]'><span id='conceptref:input_range__'><span class='texttt'>input_<span class='shy'></span>range</span></span></a> R, <span class='keyword'>class</span> Alloc<span class='anglebracket'>&gt;</span>
  <span class='keyword'>requires</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to___'><span class='texttt'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span>ranges<span class='operator'>::</span>range_reference_t<span class='anglebracket'>&lt;</span>R<span class='anglebracket'>&gt;</span>, yielded<span class='anglebracket'>&gt;</span>
  <span class="added keyword">constexpr</span> <span class='keyword'>auto</span> yield_value<span class='parenthesis'>(</span>ranges<span class='operator'>::</span>elements_of<span class='anglebracket'>&lt;</span>R, Alloc<span class='anglebracket'>&gt;</span> r<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='promise-13'><div class='marginalizedparent'><a class='marginalized' href='#promise-13'>13</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17156'>#</a></div><div class='texpara'><div id='promise-13.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
<span class='codeblock'><span class='keyword'>auto</span> nested <span class='operator'>=</span> <span class='squarebracket'>[</span><span class='squarebracket'>]</span><span class='parenthesis'>(</span>allocator_arg_t, Alloc, ranges<span class='operator'>::</span>iterator_t<span class='anglebracket'>&lt;</span>R<span class='anglebracket'>&gt;</span> i, ranges<span class='operator'>::</span>sentinel_t<span class='anglebracket'>&lt;</span>R<span class='anglebracket'>&gt;</span> s<span class='parenthesis'>)</span>
  <span class='operator'>-</span><span class='anglebracket'>&gt;</span> generator<span class='anglebracket'>&lt;</span>yielded, ranges<span class='operator'>::</span>range_value_t<span class='anglebracket'>&lt;</span>R<span class='anglebracket'>&gt;</span>, Alloc<span class='anglebracket'>&gt;</span> <span class='curlybracket'>{</span>
    <span class='keyword'>for</span> <span class='parenthesis'>(</span>; i <span class='operator'>!</span><span class='operator'>=</span> s; <span class='operator'>+</span><span class='operator'>+</span>i<span class='parenthesis'>)</span> <span class='curlybracket'>{</span>
      <span class='keyword'>co_yield</span> <span class='keyword'>static_cast</span><span class='anglebracket'>&lt;</span>yielded<span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='operator'>*</span>i<span class='parenthesis'>)</span>;
    <span class='curlybracket'>}</span>
  <span class='curlybracket'>}</span>;
<span class='keyword'>return</span> yield_value<span class='parenthesis'>(</span>ranges<span class='operator'>::</span>elements_of<span class='parenthesis'>(</span>nested<span class='parenthesis'>(</span>
  allocator_arg, r<span class='operator'>.</span>allocator, ranges<span class='operator'>::</span>begin<span class='parenthesis'>(</span>r<span class='operator'>.</span>range<span class='parenthesis'>)</span>, ranges<span class='operator'>::</span>end<span class='parenthesis'>(</span>r<span class='operator'>.</span>range<span class='parenthesis'>)</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span><span class='parenthesis'>)</span>;
</span></div></div></div></div><div class='para nonNormativeOnly' id='promise-14'><div class='marginalizedparent'><a class='marginalized' href='#promise-14'>14</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17170'>#</a></div><div class='texpara'><div id='promise-note-1' class='note'><div class='texpara'>[<i>Note&nbsp;<a href='#promise-note-1'>1</a></i>:&ensp;<div id='promise-14.sentence-1' class='sentence'>A <a href='expr.yield#nt:yield-expression' title='7.6.17&emsp;Yielding a value&emsp;[expr.yield]'><span id='ntref:yield-expression__'><span class='textsf'><i >yield-expression</i></span></span></a> that calls this function
has type <span class='texttt'><span class='keyword'>void</span></span> (<a href='expr.yield' title='7.6.17&emsp;Yielding a value'>[expr.<span class='shy'></span>yield]</a>)<a class='hidden_link' href='#promise-14.sentence-1'>.</a></div> —&nbsp;<i>end note</i>]</div></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,unhandled_exception'><div id='lib:unhandled_exception,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:unhandled_exception,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>void</span> unhandled_exception<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='promise-15'><div class='marginalizedparent'><a class='marginalized' href='#promise-15'>15</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17183'>#</a></div><div class='texpara'><div id='promise-15.sentence-1' class='sentence'><i >Preconditions</i>: A handle referring to the coroutine whose promise object is <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span>
is at the top of <span class='texttt'><span class='operator'>*</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>
of some <span class='texttt'>generator</span> object <span class='texttt'>x</span><a class='hidden_link' href='#promise-15.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-16'><div class='marginalizedparent'><a class='marginalized' href='#promise-16'>16</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17189'>#</a></div><div class='texpara'><div id='promise-16.sentence-1' class='sentence'><i >Effects</i>: If the handle referring to the coroutine
whose promise object is <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span>
is the sole element of <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span>,
equivalent to <span class='texttt'><span class='keyword'>throw</span></span>,
otherwise, assigns <span class='texttt'>current_<span class='shy'></span>exception<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> to <span class='texttt'><i >except_<span class='shy'></span></i></span><a class='hidden_link' href='#promise-16.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,operator_new'><div id='lib:operator_new,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_new,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size<span class='parenthesis'>)</span>
  <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as_____'><span class='texttt'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.default.init#concept:default_initializable' title='18.4.12&emsp;Concept default_&shy;initializable&emsp;[concept.default.init]'><span id='conceptref:default_initializable_'><span class='texttt'>default_<span class='shy'></span>initializable</span></span></a><span class='anglebracket'>&lt;</span>Allocator<span class='anglebracket'>&gt;</span>;

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Alloc, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Args<span class='anglebracket'>&gt;</span>
  <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as______'><span class='texttt'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to____'><span class='texttt'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span>, Allocator<span class='anglebracket'>&gt;</span>
  <span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size, allocator_arg_t, <span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span> alloc, <span class='keyword'>const</span> Args<span class='operator'>&amp;</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='parenthesis'>)</span>;

<span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> This, <span class='keyword'>class</span> Alloc, <span class='keyword'>class</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span> Args<span class='anglebracket'>&gt;</span>
  <span class='keyword'>requires</span> <a href='concept.same#concept:same_as' title='18.4.2&emsp;Concept same_&shy;as&emsp;[concept.same]'><span id='conceptref:same_as_______'><span class='texttt'>same_<span class='shy'></span>as</span></span></a><span class='anglebracket'>&lt;</span>Allocator, <span class='keyword'>void</span><span class='anglebracket'>&gt;</span> <span class='operator'>|</span><span class='operator'>|</span> <a href='concept.convertible#concept:convertible_to' title='18.4.4&emsp;Concept convertible_&shy;to&emsp;[concept.convertible]'><span id='conceptref:convertible_to_____'><span class='texttt'>convertible_<span class='shy'></span>to</span></span></a><span class='anglebracket'>&lt;</span><span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span>, Allocator<span class='anglebracket'>&gt;</span>
  <span class="added keyword">constexpr</span> <span class='keyword'>void</span><span class='operator'>*</span> <span class='keyword'>operator</span> <span class='keyword'>new</span><span class='parenthesis'>(</span>size_t size, <span class='keyword'>const</span> This<span class='operator'>&amp;</span>, allocator_arg_t, <span class='keyword'>const</span> Alloc<span class='operator'>&amp;</span> alloc,
                     <span class='keyword'>const</span> Args<span class='operator'>&amp;</span><span class='operator'>.</span><span class='operator'>.</span><span class='operator'>.</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='promise-17'><div class='marginalizedparent'><a class='marginalized' href='#promise-17'>17</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17214'>#</a></div><div class='texpara'><div id='promise-17.sentence-1' class='sentence'>Let <span class='texttt'>A</span> be
<ul class='itemize'><li id='promise-17.1'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#promise-17.1'>(17.1)</a></div><span class='texttt'>Allocator</span>, if it is not <span class='texttt'><span class='keyword'>void</span></span>,</li><li id='promise-17.2'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#promise-17.2'>(17.2)</a></div><span class='texttt'>Alloc</span> for the overloads with a template parameter <span class='texttt'>Alloc</span>, or</li><li id='promise-17.3'><div class='marginalizedparent' style='left:-39mm'><a class='marginalized' href='#promise-17.3'>(17.3)</a></div><span class='texttt'>allocator<span class='anglebracket'>&lt;</span><span class='keyword'>void</span><span class='anglebracket'>&gt;</span></span> otherwise<a class='hidden_link' href='#promise-17.sentence-1'>.</a></li></ul></div> <div id='promise-17.sentence-2' class='sentence'>
Let <span class='texttt'>B</span> be <span class='texttt'>allocator_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>A<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span><span class='keyword'>template</span> rebind_<span class='shy'></span>alloc<span class='anglebracket'>&lt;</span>U<span class='anglebracket'>&gt;</span></span>
where <span class='texttt'>U</span> is an unspecified type whose size and alignment
are both <span class='texttt'>__STDCPP_<span class='shy'></span>DEFAULT_<span class='shy'></span>NEW_<span class='shy'></span>ALIGNMENT__</span><a class='hidden_link' href='#promise-17.sentence-2'>.</a></div></div></div></div><div class='para' id='promise-18'><div class='marginalizedparent'><a class='marginalized' href='#promise-18'>18</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17228'>#</a></div><div class='texpara'><div id='promise-18.sentence-1' class='sentence'><i >Mandates</i>: <span class='texttt'>allocator_<span class='shy'></span>traits<span class='anglebracket'>&lt;</span>B<span class='anglebracket'>&gt;</span><span class='operator'>&#x200b;::&#x200b;</span>pointer</span> is a pointer type<a class='hidden_link' href='#promise-18.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-19'><div class='marginalizedparent'><a class='marginalized' href='#promise-19'>19</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17232'>#</a></div><div class='texpara'><div id='promise-19.sentence-1' class='sentence'><i >Effects</i>: Initializes an allocator <span class='texttt'>b</span> of type <span class='texttt'>B</span> with <span class='texttt'>A<span class='parenthesis'>(</span>alloc<span class='parenthesis'>)</span></span>,
for the overloads with a function parameter <span class='texttt'>alloc</span>,
and with <span class='texttt'>A<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> otherwise<a class='hidden_link' href='#promise-19.sentence-1'>.</a></div> <div id='promise-19.sentence-2' class='sentence'>Uses <span class='texttt'>b</span> to allocate storage for the smallest array
of <span class='texttt'>U</span> sufficient to provide storage for
a coroutine state of size <span class='texttt'>size</span>, and
unspecified additional state necessary to ensure that
<span class='texttt'><span class='keyword'>operator</span> <span class='keyword'>delete</span></span> can later deallocate this memory block
with an allocator equal to <span class='texttt'>b</span><a class='hidden_link' href='#promise-19.sentence-2'>.</a></div></div></div></div><div class='para' id='promise-20'><div class='marginalizedparent'><a class='marginalized' href='#promise-20'>20</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17244'>#</a></div><div class='texpara'><div id='promise-20.sentence-1' class='sentence'><i >Returns</i>: A pointer to the allocated storage<a class='hidden_link' href='#promise-20.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::promise_type,operator_delete'><div id='lib:operator_delete,generator::promise_type'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator_delete,generator::promise_type'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span> <span class='keyword'>delete</span><span class='parenthesis'>(</span><span class='keyword'>void</span><span class='operator'>*</span> pointer, size_t size<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='promise-21'><div class='marginalizedparent'><a class='marginalized' href='#promise-21'>21</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17255'>#</a></div><div class='texpara'><div id='promise-21.sentence-1' class='sentence'><i >Preconditions</i>: <span class='texttt'>pointer</span> was returned from an invocation of
one of the above overloads of <span class='texttt'><span class='keyword'>operator</span> <span class='keyword'>new</span></span>
with a <span class='texttt'>size</span> argument equal to <span class='texttt'>size</span><a class='hidden_link' href='#promise-21.sentence-1'>.</a></div></div></div></div><div class='para' id='promise-22'><div class='marginalizedparent'><a class='marginalized' href='#promise-22'>22</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17261'>#</a></div><div class='texpara'><div id='promise-22.sentence-1' class='sentence'><i >Effects</i>: Deallocates the storage pointed to by <span class='texttt'>pointer</span>
using an allocator equivalent to that used to allocate it<a class='hidden_link' href='#promise-22.sentence-1'>.</a></div></div></div></div></div><div id='iterator' class='section'><h3 ><a class='secnum' href='#iterator' style='min-width:80pt'>26.8.6</a> Class <span class='texttt'>generator&#x200b;::&#x200b;<span class='texttt'><i >iterator</i></span></span> <a class='abbr_ref' href='coro.generator.iterator'>[coro.generator.iterator]</a></h3><div class='texpara'><span class='codeblock'><span class='keyword'>namespace</span> std <span class='curlybracket'>{</span>
  <span class='keyword'>template</span><span class='anglebracket'>&lt;</span><span class='keyword'>class</span> Ref, <span class='keyword'>class</span> Val, <span class='keyword'>class</span> Allocator<span class='anglebracket'>&gt;</span>
  <span class='keyword'>class</span> generator<span class='anglebracket'>&lt;</span>Ref, Val, Allocator<span class='anglebracket'>&gt;</span><span class='operator'>::</span><i >iterator</i> <span class='curlybracket'>{</span>
  <span class='keyword'>public</span><span class='operator'>:</span>
    <span class='keyword'>using</span> value_type <span class='operator'>=</span> <i >value</i>;
    <span class='keyword'>using</span> difference_type <span class='operator'>=</span> ptrdiff_t;

    <span class="added keyword">constexpr</span> <i >iterator</i><span class='parenthesis'>(</span><i >iterator</i><span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
    <span class="added keyword">constexpr</span> <i >iterator</i><span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><i >iterator</i><span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;

    <span class="added keyword">constexpr</span> <i >reference</i> <span class='keyword'>operator</span><span class='operator'>*</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span><span class='parenthesis'>(</span>is_nothrow_copy_constructible_v<span class='anglebracket'>&lt;</span><i >reference</i><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <i >iterator</i><span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
    <span class="added keyword">constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span>;

    <span class="added keyword">constexpr</span> <span class='keyword'>friend</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> <i >iterator</i><span class='operator'>&amp;</span> i, default_sentinel_t<span class='parenthesis'>)</span>;

  <span class='keyword'>private</span><span class='operator'>:</span>
    coroutine_handle<span class='anglebracket'>&lt;</span>promise_type<span class='anglebracket'>&gt;</span> <i >coroutine_</i>; <span class='comment'>// <i >exposition only</i></span>
  <span class='curlybracket'>}</span>;
<span class='curlybracket'>}</span>
</span></div><div class='texpara'><div id='lib:generator::iterator,constructor'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:generator::iterator,constructor'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='texttt'><i >iterator</i></span><span class='parenthesis'>(</span><span class='texttt'><i >iterator</i></span><span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div><div class='para' id='iterator-1'><div class='marginalizedparent'><a class='marginalized' href='#iterator-1'>1</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17298'>#</a></div><div class='texpara'><div id='iterator-1.sentence-1' class='sentence'><i >Effects</i>: Initializes <span class='texttt'><i >coroutine_<span class='shy'></span></i></span>
with <span class='texttt'>exchange<span class='parenthesis'>(</span>other<span class='operator'>.</span><span class='texttt'><i >coroutine_<span class='shy'></span></i></span>, <span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#iterator-1.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::iterator,operator='><div id='lib:operator=,generator::iterator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator=,generator::iterator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='texttt'><i >iterator</i></span><span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='texttt'><i >iterator</i></span><span class='operator'>&amp;</span><span class='operator'>&amp;</span> other<span class='parenthesis'>)</span> <span class='keyword'>noexcept</span>;
</code></div></div></div></div><div class='para' id='iterator-2'><div class='marginalizedparent'><a class='marginalized' href='#iterator-2'>2</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17310'>#</a></div><div class='texpara'><div id='iterator-2.sentence-1' class='sentence'><i >Effects</i>: Equivalent to
<span class='texttt'><span class='texttt'><i >coroutine_<span class='shy'></span></i></span> <span class='operator'>=</span> exchange<span class='parenthesis'>(</span>other<span class='operator'>.</span><span class='texttt'><i >coroutine_<span class='shy'></span></i></span>, <span class='curlybracket'>{</span><span class='curlybracket'>}</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#iterator-2.sentence-1'>.</a></div></div></div></div><div class='para' id='iterator-3'><div class='marginalizedparent'><a class='marginalized' href='#iterator-3'>3</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17315'>#</a></div><div class='texpara'><div id='iterator-3.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#iterator-3.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::iterator,operator*'><div id='lib:operator*,generator::iterator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator*,generator::iterator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='texttt'><i >reference</i></span> <span class='keyword'>operator</span><span class='operator'>*</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span> <span class='keyword'>const</span> <span class='keyword'>noexcept</span><span class='parenthesis'>(</span>is_nothrow_copy_constructible_v<span class='anglebracket'>&lt;</span><span class='texttt'><i >reference</i></span><span class='anglebracket'>&gt;</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='iterator-4'><div class='marginalizedparent'><a class='marginalized' href='#iterator-4'>4</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17326'>#</a></div><div class='texpara'><div id='iterator-4.sentence-1' class='sentence'><i >Preconditions</i>: For some <span class='texttt'>generator</span> object <span class='texttt'>x</span>,
<span class='texttt'><i >coroutine_<span class='shy'></span></i></span> is in <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span> and
<span class='texttt'>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span><span class='operator'>-</span><span class='anglebracket'>&gt;</span>top<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span> refers to
a suspended coroutine with promise object <span class='texttt'>p</span><a class='hidden_link' href='#iterator-4.sentence-1'>.</a></div></div></div></div><div class='para' id='iterator-5'><div class='marginalizedparent'><a class='marginalized' href='#iterator-5'>5</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17333'>#</a></div><div class='texpara'><div id='iterator-5.sentence-1' class='sentence'><i >Effects</i>: Equivalent to:
<span class='texttt'><span class='keyword'>return</span> <span class='keyword'>static_<span class='shy'></span>cast</span><span class='anglebracket'>&lt;</span><span class='texttt'><i >reference</i></span><span class='anglebracket'>&gt;</span><span class='parenthesis'>(</span><span class='operator'>*</span>p<span class='operator'>.</span><span class='texttt'><i >value_<span class='shy'></span></i></span><span class='parenthesis'>)</span>;</span></div></div></div></div><div class='texpara'><div id='lib:generator::iterator,operator++'><div id='lib:operator++,generator::iterator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator++,generator::iterator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='texttt'><i >iterator</i></span><span class='operator'>&amp;</span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='iterator-6'><div class='marginalizedparent'><a class='marginalized' href='#iterator-6'>6</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17345'>#</a></div><div class='texpara'><div id='iterator-6.sentence-1' class='sentence'><i >Preconditions</i>: For some <span class='texttt'>generator</span> object <span class='texttt'>x</span>,
<span class='texttt'><i >coroutine_<span class='shy'></span></i></span> is in <span class='texttt'><span class='operator'>*</span>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span></span><a class='hidden_link' href='#iterator-6.sentence-1'>.</a></div></div></div></div><div class='para' id='iterator-7'><div class='marginalizedparent'><a class='marginalized' href='#iterator-7'>7</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17350'>#</a></div><div class='texpara'><div id='iterator-7.sentence-1' class='sentence'><i >Effects</i>: Equivalent to <span class='texttt'>x<span class='operator'>.</span><span class='texttt'><i >active_<span class='shy'></span></i></span><span class='operator'>-</span><span class='anglebracket'>&gt;</span>top<span class='parenthesis'>(</span><span class='parenthesis'>)</span><span class='operator'>.</span>resume<span class='parenthesis'>(</span><span class='parenthesis'>)</span></span><a class='hidden_link' href='#iterator-7.sentence-1'>.</a></div></div></div></div><div class='para' id='iterator-8'><div class='marginalizedparent'><a class='marginalized' href='#iterator-8'>8</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17354'>#</a></div><div class='texpara'><div id='iterator-8.sentence-1' class='sentence'><i >Returns</i>: <span class='texttt'><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#iterator-8.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::iterator,operator++_'><div id='lib:operator++,generator::iterator_'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator++,generator::iterator_'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>void</span> <span class='keyword'>operator</span><span class='operator'>+</span><span class='operator'>+</span><span class='parenthesis'>(</span><span class='keyword'>int</span><span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='iterator-9'><div class='marginalizedparent'><a class='marginalized' href='#iterator-9'>9</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17365'>#</a></div><div class='texpara'><div id='iterator-9.sentence-1' class='sentence'><i >Effects</i>: Equivalent to <span class='texttt'><span class='operator'>+</span><span class='operator'>+</span><span class='operator'>*</span><span class='keyword'>this</span></span><a class='hidden_link' href='#iterator-9.sentence-1'>.</a></div></div></div></div><div class='texpara'><div id='lib:generator::iterator,operator=='><div id='lib:operator==,generator::iterator'><div class='itemdecl'><div class='marginalizedparent'><a class='itemDeclLink' href='#lib:operator==,generator::iterator'>🔗</a></div><code class='itemdeclcode'><span class="added keyword">constexpr</span> <span class='keyword'>friend</span> <span class='keyword'>bool</span> <span class='keyword'>operator</span><span class='operator'>=</span><span class='operator'>=</span><span class='parenthesis'>(</span><span class='keyword'>const</span> <span class='texttt'><i >iterator</i></span><span class='operator'>&amp;</span> i, default_sentinel_t<span class='parenthesis'>)</span>;
</code></div></div></div></div><div class='para' id='iterator-10'><div class='marginalizedparent'><a class='marginalized' href='#iterator-10'>10</a></div><div class='itemdescr'><div class='sourceLinkParent'><a class='sourceLink' href='http://github.com/Eelis/draft/tree/dbf90c5d424d121918e0ad72c62d97ef0059d67e/source/ranges.tex#L17376'>#</a></div><div class='texpara'><div id='iterator-10.sentence-1' class='sentence'><i >Effects</i>: Equivalent to: <span class='texttt'><span class='keyword'>return</span> i<span class='operator'>.</span><span class='texttt'><i >coroutine_<span class='shy'></span></i></span><span class='operator'>.</span>done<span class='parenthesis'>(</span><span class='parenthesis'>)</span>;</span></div></div></div></div></div>
  </div>
  <h3 id="feature-test-macros"><a href="#feature-test-macros">Feature test macros</a></h3>
  <div class="wording">
  <h2><a href="http://eel.is/c++draft/version.syn">17.3.2 Header &lt;version&gt; synopsis [version.syn]</a></h2>
  <div class="description">
  <code>#define __cpp_lib_generator <span class="removed">202207</span><span class="added">2024??</span>L</code>
  </div>

  </div>
</div></div></article>
</div><script>
	hljs.addPlugin(mergeHTMLPlugin);
	hljs.highlightAll();
</script>
</body>
</html>
