{"id":3964,"date":"2026-07-10T16:34:12","date_gmt":"2026-07-10T16:34:12","guid":{"rendered":"https:\/\/www.chess.lumn.eu\/wordpress\/?p=3964"},"modified":"2026-07-10T19:19:59","modified_gmt":"2026-07-10T19:19:59","slug":"fritz-sous-gui-alternatives","status":"publish","type":"post","link":"https:\/\/www.chess.lumn.eu\/wordpress\/2026\/07\/10\/fritz-sous-gui-alternatives\/","title":{"rendered":"Fritz sous GUI alternatives"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3964\" class=\"elementor elementor-3964\">\n\t\t\t\t\t\t<div class=\"elementor-inner\">\n\t\t\t\t<div class=\"elementor-section-wrap\">\n\t\t\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b7bf6e2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b7bf6e2\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t\t\t<div class=\"elementor-row\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d3145fb\" data-id=\"d3145fb\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-column-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-391c71f elementor-widget elementor-widget-html\" data-id=\"391c71f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Faire rejouer les vieux Fritz \u2014 le pont eng2uci<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:ital,opsz,wght@0,9..40,300..700;1,9..40,400&family=JetBrains+Mono:wght@400;500;700&display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --creme:#f7f4ee; --encre:#2b2b2b; --rouge:#c0392b;\n    --or:#b8863b; --trait:#e3ddd0; --gris:#6b665c;\n  }\n  *{box-sizing:border-box;}\n  html{scroll-behavior:smooth;}\n  body{\n    margin:0; background:var(--creme); color:var(--encre);\n    font-family:'DM Sans',system-ui,sans-serif; font-weight:400;\n    font-size:18px; line-height:1.72; -webkit-font-smoothing:antialiased;\n  }\n  .naum-body{max-width:900px; margin:0 auto; padding:64px 28px 120px;}\n\n  h1{font-family:'DM Serif Display',serif; font-weight:400; font-size:2.9rem;\n     line-height:1.08; letter-spacing:-.5px; margin:0 0 .35em;}\n  h2{font-family:'DM Serif Display',serif; font-weight:400; font-size:1.85rem;\n     line-height:1.15; letter-spacing:-.3px; margin:2.6em 0 .5em; padding-bottom:.25em;\n     border-bottom:2px solid var(--rouge);}\n  h3{font-family:'DM Sans',sans-serif; font-weight:700; font-size:1.1rem;\n     letter-spacing:.2px; text-transform:uppercase; margin:1.8em 0 .4em; color:var(--rouge);}\n  .eyebrow{font-family:'JetBrains Mono',monospace; font-size:.78rem; letter-spacing:3px;\n     text-transform:uppercase; color:var(--or); margin:0 0 1.2em;}\n  .chapeau{font-size:1.22rem; line-height:1.6; color:var(--gris); font-style:italic;\n     margin:0 0 2.4em; padding-left:1.1em; border-left:3px solid var(--or);}\n  p{margin:0 0 1.15em;}\n  a{color:var(--rouge); text-decoration:none; border-bottom:1px solid rgba(192,57,43,.35);}\n  a:hover{border-bottom-color:var(--rouge);}\n  strong{font-weight:700;}\n  code{font-family:'JetBrains Mono',monospace; font-size:.85em; background:#efe9dd;\n     padding:.08em .35em; border-radius:3px; color:#7a3b2e;}\n  ul,ol{margin:0 0 1.2em; padding-left:1.35em;}\n  li{margin:.4em 0;}\n\n  ol.etapes{list-style:none; padding-left:0; counter-reset:et;}\n  ol.etapes>li{counter-increment:et; position:relative; padding-left:52px; margin:1.1em 0;}\n  ol.etapes>li::before{content:counter(et); position:absolute; left:0; top:-2px;\n     width:34px; height:34px; border-radius:50%; background:var(--rouge); color:#fff;\n     font-family:'JetBrains Mono',monospace; font-weight:700; font-size:1rem;\n     display:flex; align-items:center; justify-content:center;}\n\n  .box{border-radius:8px; padding:18px 22px; margin:1.6em 0; font-size:.97rem; line-height:1.62;}\n  .box .box-titre{font-family:'JetBrains Mono',monospace; font-size:.72rem; letter-spacing:2px;\n     text-transform:uppercase; display:block; margin-bottom:.5em; font-weight:700;}\n  .naum-note-box{background:#f3ecda; border:1px solid #ddd0ab;}\n  .naum-note-box .box-titre{color:#9a7b2e;}\n  .naum-alert-box{background:#fbeae7; border:1px solid #e8b6ac;}\n  .naum-alert-box .box-titre{color:var(--rouge);}\n  .naum-coherence-box{background:#e9f2e6; border:1px solid #b6d3ab;}\n  .naum-coherence-box .box-titre{color:#4e7a3b;}\n\n  .tbl-wrap{overflow-x:auto; margin:1.6em 0;}\n  table{border-collapse:collapse; width:100%; font-size:.9rem;}\n  th,td{border:1px solid var(--trait); padding:10px 13px; text-align:left; vertical-align:top;}\n  th{background:#efe9dd; font-weight:700; letter-spacing:.3px;}\n  tbody tr:nth-child(even){background:#faf7f0;}\n  .ok{color:#4e7a3b; font-weight:700;}\n\n  .champ{font-family:'JetBrains Mono',monospace; font-size:.82rem; background:#20232a;\n     color:#e6e1d6; padding:14px 18px; border-radius:6px; margin:.6em 0; overflow-x:auto;\n     border-left:3px solid var(--or);}\n  .champ b{color:#e8b17a; font-weight:700;}\n\n  .dl-zone{background:#20232a; border-radius:12px; padding:34px 30px; margin:2.2em 0;\n     text-align:center; color:#e6e1d6;}\n  .dl-zone h3{color:#e8b17a; margin:0 0 .3em;}\n  .dl-zone p{color:#b7b1a4; font-size:.95rem; margin:0 0 1.4em;}\n  .dl-button{font-family:'DM Sans',sans-serif; font-weight:700; font-size:1.05rem;\n     background:var(--rouge); color:#fff; border:none; padding:15px 34px; border-radius:8px;\n     cursor:pointer; letter-spacing:.3px; transition:transform .12s ease, background .2s ease;}\n  .dl-button:hover{background:#a5301f; transform:translateY(-2px);}\n  .dl-button:active{transform:translateY(0);}\n  .dl-sub{font-family:'JetBrains Mono',monospace; font-size:.74rem; color:#8a857a; margin-top:1em;}\n\n  hr{border:none; border-top:1px solid var(--trait); margin:3em 0;}\n  .sig{font-family:'JetBrains Mono',monospace; font-size:.78rem; color:var(--gris);\n     text-align:right; margin-top:3.5em;}\n\n  @media (max-width:600px){\n    body{font-size:16px;} h1{font-size:2.1rem;} h2{font-size:1.45rem;}\n    .naum-body{padding:44px 18px 90px;}\n  }\n<\/style>\n<\/head>\n<body>\n<article class=\"naum-body\">\n\n  <p class=\"eyebrow\">Laboratoire \u00b7 moteurs d'\u00e9checs classiques<\/p>\n  <h1>Faire rejouer les vieux Fritz<\/h1>\n  <p class=\"chapeau\">\n    Les Fritz d'autrefois &mdash; de la 5.32 (1997) \u00e0 la 9 (2005) &mdash; sont enferm\u00e9s dans le\n    logiciel ChessBase qui les a vus na\u00eetre. Un petit pont les lib\u00e8re : il les fait passer\n    pour des moteurs UCI ordinaires, afin qu'on puisse enfin les faire jouer et les calibrer\n    dans les interfaces modernes.\n  <\/p>\n\n  <h2>Ce qu'on cherche \u00e0 faire<\/h2>\n  <p>\n    Un moteur d'\u00e9checs moderne est un programme autonome qui dialogue en texte, selon un\n    langage universel appel\u00e9 <strong>UCI<\/strong> : l'interface lui envoie une position, il\n    r\u00e9pond son coup. C'est ce langage que parlent toutes les interfaces pour moteurs d'\u00e9checs\n    d'aujourd'hui, et c'est lui qui permet de faire s'affronter des moteurs de toutes origines.\n  <\/p>\n  <p>\n    Les vieux Fritz, eux, ne fonctionnent pas ainsi. Ce ne sont pas des programmes autonomes\n    mais des <strong>modules internes<\/strong> : seul le logiciel ChessBase d'origine sait les\n    charger et les faire parler. Impossible, tel quel, de les brancher sur une interface\n    moderne &mdash; ils restent muets.\n  <\/p>\n  <p>\n    L'id\u00e9e du pont &mdash; qu'on appellera <code>eng2uci<\/code> &mdash; est de <strong>se glisser \u00e0 la\n    place de ChessBase<\/strong>. Le programme charge le vieux moteur, lui parle exactement\n    comme le faisait le logiciel d'\u00e9poque, r\u00e9cup\u00e8re le coup qu'il a choisi, puis le retraduit\n    en UCI. Vu de l'ext\u00e9rieur, le vieux Fritz devient un moteur UCI comme les autres, qu'on\n    peut piloter depuis n'importe quelle interface.\n  <\/p>\n  <div class=\"box naum-note-box\">\n    <span class=\"box-titre\">Pourquoi le faire<\/span>\n    Pour donner \u00e0 ces moteurs historiques une place dans une \u00e9chelle de calibration Elo :\n    les faire jouer des centaines de parties contre des r\u00e9f\u00e9rences, mesurer leur force r\u00e9elle,\n    et comparer les g\u00e9n\u00e9rations. Sans ce pont, ils resteraient \u00e0 jamais prisonniers de leur\n    logiciel d'origine.\n  <\/div>\n\n  <h2>R\u00e9sultats : les cinq Fritz<\/h2>\n  <p>\n    Chaque version a ses particularit\u00e9s, mais toutes tournent d\u00e9sormais comme des moteurs UCI\n    natifs &mdash; coups l\u00e9gaux, promotions, roques, gestion du temps. Voici l'\u00e9tat des lieux.\n  <\/p>\n  <div class=\"tbl-wrap\">\n  <table>\n    <thead>\n      <tr><th>Version<\/th><th>Ann\u00e9e<\/th><th>\u00c9tat<\/th><th>\u00c0 savoir<\/th><\/tr>\n    <\/thead>\n    <tbody>\n      <tr><td><strong>Fritz 5.32<\/strong><\/td><td>1997<\/td><td class=\"ok\">Op\u00e9rationnel<\/td>\n        <td>Le doyen. Format interne un peu diff\u00e9rent des suivants, mais enti\u00e8rement pris en charge.<\/td><\/tr>\n      <tr><td><strong>Fritz 6<\/strong><\/td><td>1999<\/td><td class=\"ok\">Op\u00e9rationnel<\/td>\n        <td>La premi\u00e8re version mise au point, celle qui a servi de r\u00e9f\u00e9rence \u00e0 tout le reste.<\/td><\/tr>\n      <tr><td><strong>Fritz 7<\/strong><\/td><td>2001<\/td><td class=\"ok\">Op\u00e9rationnel<\/td>\n        <td>Valid\u00e9e en partie compl\u00e8te (promotions, prises, pilotage au temps).<\/td><\/tr>\n      <tr><td><strong>Fritz 8<\/strong><\/td><td>2003<\/td><td class=\"ok\">Op\u00e9rationnel<\/td>\n        <td>Fonctionne sur la m\u00eame base que la 7.<\/td><\/tr>\n      <tr><td><strong>Fritz 9<\/strong><\/td><td>2005<\/td><td class=\"ok\">Op\u00e9rationnel<\/td>\n        <td>La plus exigeante : elle r\u00e9clame un composant syst\u00e8me (<code>MSVCR71.dll<\/code>)\n        et v\u00e9rifie la pr\u00e9sence du CD d'origine &mdash; les deux sont g\u00e9r\u00e9s par le pont.<\/td><\/tr>\n    <\/tbody>\n  <\/table>\n  <\/div>\n  <div class=\"box naum-note-box\">\n    <span class=\"box-titre\">Ordre de grandeur<\/span>\n    Ces moteurs couvrent grosso modo la fourchette allant du milieu des ann\u00e9es 1990 au milieu\n    des ann\u00e9es 2000 &mdash; soit une force historique qui s'\u00e9tage d'environ 2400 \u00e0 2850 Elo. Leur\n    valeur exacte, sur l'\u00e9chelle du laboratoire, est justement ce que les gauntlets de\n    calibration \u00e9tablissent.\n  <\/div>\n\n  <h2>T\u00e9l\u00e9charger le pont<\/h2>\n  <div class=\"dl-zone\">\n    <h3>eng2uci.py<\/h3>\n    <p>Le pont complet, en un seul fichier. G\u00e8re les cinq versions de Fritz.<\/p>\n    <button id=\"dl-btn\" class=\"dl-button\">&#x2193;&nbsp;&nbsp;T\u00e9l\u00e9charger eng2uci.py<\/button>\n    <div class=\"dl-sub\">script Python &middot; \u00e0 placer dans le dossier du moteur<\/div>\n  <\/div>\n  <div class=\"box naum-alert-box\">\n    <span class=\"box-titre\">Pr\u00e9requis indispensable<\/span>\n    Les modules Fritz sont en <strong>32 bits<\/strong> : il faut donc un <strong>Python 32\n    bits<\/strong> (les versions 64 bits ne pourront pas charger les moteurs). Sous Windows,\n    installer Python puis v\u00e9rifier depuis un terminal : <code>py -3-32 --version<\/code> doit\n    r\u00e9pondre sans erreur.\n  <\/div>\n\n  <h3>Le dossier \u00e0 pr\u00e9parer<\/h3>\n  <p>Pour chaque moteur, un dossier contenant :<\/p>\n  <ul>\n    <li><code>eng2uci.py<\/code> &mdash; le pont (t\u00e9l\u00e9charg\u00e9 ci-dessus) ;<\/li>\n    <li><code>Chess32.dll<\/code> &mdash; le petit relais que le moteur r\u00e9clame ;<\/li>\n    <li>le fichier du moteur, par exemple <code>Fritz 6.eng<\/code> ;<\/li>\n    <li>pour Fritz 9 uniquement : <code>MSVCR71.dll<\/code> (le composant syst\u00e8me mentionn\u00e9 plus haut).<\/li>\n  <\/ul>\n\n  <h2>Utilisation dans Banksia<\/h2>\n  <p>\n    Banksia est l'interface recommand\u00e9e : elle pilote le pont sans configuration exotique.\n  <\/p>\n  <ol class=\"etapes\">\n    <li>Dans Banksia, ouvrir <strong>Engines<\/strong> puis <strong>Add<\/strong> (ajouter un moteur).<\/li>\n    <li>Au champ <strong>Fichier du moteur<\/strong> (l'ex\u00e9cutable), indiquer le chemin du\n      <strong>Python 32 bits<\/strong>, typiquement :\n      <div class=\"champ\">C:\\Users\\...\\Python313-32\\python.exe<\/div><\/li>\n    <li>Au champ <strong>Dossier de travail<\/strong> (working folder), indiquer le dossier\n      pr\u00e9par\u00e9 (celui qui contient <code>eng2uci.py<\/code>, le <code>.eng<\/code> et\n      <code>Chess32.dll<\/code>).<\/li>\n    <li>Au champ <strong>Ligne de commandes<\/strong> (arguments), passer le pont suivi du nom\n      du fichier moteur, entre guillemets s'il contient une espace :\n      <div class=\"champ\">eng2uci.py <b>\"Fritz 6.eng\"<\/b><\/div>\n      (adapter le nom du fichier selon la version voulue.)<\/li>\n    <li>Choisir le protocole <strong>UCI<\/strong>, puis valider. Banksia interroge le moteur :\n      il doit r\u00e9pondre son nom (&laquo;&nbsp;Fritz 6&nbsp;&raquo;) et son auteur.<\/li>\n    <li>R\u00e9gler la <strong>taille de hash<\/strong> dans les options du moteur si souhait\u00e9, puis\n      cr\u00e9er un tournoi, choisir la cadence et lancer.<\/li>\n  <\/ol>\n  <div class=\"box naum-coherence-box\">\n    <span class=\"box-titre\">V\u00e9rification rapide<\/span>\n    Avant de lancer un tournoi, un test en ligne de commande confirme tout :\n    <div class=\"champ\" style=\"border-left-color:#4e7a3b; margin-top:.8em;\">py -3-32 eng2uci.py \"Fritz 6.eng\"<br>uci<br>isready<br>position startpos<br>go depth 8<\/div>\n    Le moteur doit annoncer sa profondeur qui grimpe, puis un <code>bestmove<\/code>.\n  <\/div>\n\n  <h2>Utilisation dans Arena<\/h2>\n  <p>\n    Arena fonctionne aussi, avec la m\u00eame logique. Comme Arena pr\u00e9f\u00e8re pointer vers un\n    <strong>lanceur unique<\/strong>, le plus simple est de cr\u00e9er \u00e0 c\u00f4t\u00e9 du moteur un petit\n    fichier <code>lancer.bat<\/code> d'une ligne :\n  <\/p>\n  <div class=\"champ\">py -3-32 eng2uci.py \"Fritz 6.eng\"<\/div>\n  <ol class=\"etapes\">\n    <li>Menu <strong>Engines &rarr; Install New Engine<\/strong>.<\/li>\n    <li>S\u00e9lectionner le fichier <code>lancer.bat<\/code> qu'on vient de cr\u00e9er (ou directement\n      le <code>python.exe<\/code> 32 bits, en renseignant ensuite les param\u00e8tres).<\/li>\n    <li>Quand Arena demande le type de moteur, choisir <strong>UCI<\/strong>.<\/li>\n    <li>Dans les propri\u00e9t\u00e9s du moteur, v\u00e9rifier que le <strong>dossier de travail<\/strong>\n      pointe bien sur le dossier du moteur (celui qui contient le <code>.eng<\/code> et\n      <code>Chess32.dll<\/code>) &mdash; c'est l\u00e0 que le pont ira chercher ses fichiers.<\/li>\n    <li>Le moteur appara\u00eet alors dans la liste d'Arena, pr\u00eat \u00e0 jouer ou \u00e0 analyser comme\n      n'importe quel moteur UCI.<\/li>\n  <\/ol>\n  <div class=\"box naum-note-box\">\n    <span class=\"box-titre\">Astuce lanceur<\/span>\n    Le fichier <code>lancer.bat<\/code> \u00e9vite bien des soucis de chemins : Arena n'a qu'\u00e0\n    l'appeler, et c'est lui qui se charge d'invoquer le bon Python avec le bon moteur. Un\n    <code>.bat<\/code> par version de Fritz, et toute la collection est pr\u00eate.\n  <\/div>\n\n  <hr>\n  <p>\n    Cinq moteurs qui semblaient perdus dans leur logiciel d'origine rejouent aujourd'hui dans\n    les interfaces modernes. La le\u00e7on de ce chantier tient en une phrase : un moteur ne se juge\n    qu'en partie r\u00e9elle &mdash; c'est l\u00e0, et nulle part ailleurs, que la v\u00e9rit\u00e9 appara\u00eet.\n  <\/p>\n  <p class=\"sig\">chess.lumn.eu &middot; laboratoire de calibration<\/p>\n\n<\/article>\n\n<script>\n  (function(){\n    var B64=\"IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiIKZW5nMnVjaS5weSAgLS0gIHBhc3NlcmVsbGUgVUNJIHBvdXIgbGVzIG1vdGV1cnMgRnJpdHogLmVuZyAoQ2hlc3NCYXNlIG5hdGlmKQogICAgICAgICAgICAgICBHZXJlIEZyaXR6IDUuMzIgLyA2IC8gNyAvIDgsIGF1dG8tZGV0ZWN0ZXMgcGFyIGxhIHRhaWxsZSBkdSAuZW5nLgoKTUVNRSBGQU1JTExFICh2ZXJpZmllIHBhciBkZXNhc3NlbWJsYWdlIGRlcyA0IGJpbmFpcmVzKSA6CiAgLSBjYWxsYmFjayBob3RlIHVuaXF1ZSBDaGVzczMyLmRsbDo6RnVuYzMgKGxlIHN0dWIgZm91cm5pIGxlIHJlc291dCkgOwogIC0gaW5pdCBFbmcxKGN0eDAuLmN0eDQsIGhhc2hLQikgKyBFbmcxNSA7IHJlY2hlcmNoZSBFbmc5KHNwYXJhbXMpIGJsb3F1YW50ZSA7CiAgLSBtZXNzYWdlcyAweDE1OD1wcm9mb25kZXVyLCAweDE1ND1yYXBwb3J0IHNjb3JlL1BWLCAweDE1Ni8weDE1Nz1wZXJpb2RpcXVlcy4KCkVOVFJFRSBVTklWRVJTRUxMRSAob2Zmc2V0cyBpZGVudGlxdWVzIHN1ciBsZXMgNCA7IGNvZGVzIGRlIHJvcXVlIHZlcmlmaWVzKSA6CiAgYm9hcmQgID0gc3BhcmFtc1sweDE4ICsgZmljaGllcio4ICsgcmFuZ2VlXSAgKGZpbGUtbWFqb3IgOiBhMT0wLGUxPTMyLGU4PTM5LGg4PTYzKQogIDB4NTg9ZmxhZygwKSAgMHg1OT10cmFpdCgwPWJsYW5jKSAgMHg1QT1lbi1wYXNzYW50KDApICAweDVCPXJvcXVlcyhiaXRzIDEvMi80LzgpCiAgY29kZXMgYnJ1dHMgOiBibGFuY3MgUj0xIEQ9MiBDPTMgRj00IFQ9NSBQPTYgOyBub2lycyA9ICs4CiAgcGFyYW1zIDogMHg4NjI9bW9kZSgyPXByb2ZvbmRldXIgZml4ZSkgIDB4ODVFPXByb2ZvbmRldXIoaXRlcmF0aW9uKSAgMHg4NzQ9Y2FwKDw9NDcpCiAgc29ydGllIDogY2FzZXMgZmlsZS1tYWpvciwgcHJvbW8gMj1DIDM9RiA0PVQgNT1ELgoKUFJPUFJFIEEgQ0hBUVVFIEJVSUxEIChhZHJlc3NlcyByZWxhdGl2ZXMgYSBsYSBiYXNlLCBleHRyYWl0ZXMgc3RhdGlxdWVtZW50KSA6CiAgTk1PVkVTIC8gU0NPUkVTIC8gTU9WRUJBU0UgIC0+IG1laWxsZXVyIGNvdXAgPSBhcmdtYXggZGVzIHNjb3JlcyByYWNpbmUKICBQViAgICAgICAtPiBsaWduZSBwcmluY2lwYWxlIChqdXNxdSdhIGZyb209PXRvKQogIE5PREUgICAgIC0+IGNvbXB0ZXVyIGRlIG5vZXVkcyA2NCBiaXRzIChiYXMgOyBoYXV0ID0gKzQpCiAgQ1AgICAgICAgLT4gY2hlY2tzIGNvcHktcHJvdGVjdGlvbiBkJ0VuZzEgYSBuZXV0cmFsaXNlciAoamUgMHg3NCAtPiBqbXAgMHhFQikKCkZyaXR6IDUuMzIgOiBzYSByZWNoZXJjaGUgaW50ZXJuZSBkaWZmZXJlIChwYXMgZGUgdGFibGVhdSBkZSBzY29yZXMgZWJ4KjQpIDsKICBsZSBtZWlsbGV1ciBjb3VwIGVzdCBkb25jIGx1IHZpYSBQVlswXSAocmVwbGkpLCBzY29yZSBub24gZGlzcG9uaWJsZSAoY3AgMCkuCiAgLT4gbGUgcGx1cyBhIHZhbGlkZXIgZGVzIHF1YXRyZS4KClRPVVQgY2VjaSBlc3QgZGVyaXZlIGRlIGwnYW5hbHlzZSBzdGF0aXF1ZSA6IGNoYXF1ZSBtb3RldXIgZGVtYW5kZSB1bmUgcGFzc2UKLS1jYWxpYiBkZSB2YWxpZGF0aW9uIChjb21tZSBGcml0eiA2IGwnYSBkZW1hbmRlKS4gU3VyIHN0YXJ0cG9zLCAiZ28gZGVwdGggNiIKZG9pdCBzb3J0aXIgdW4gY291cCBMRUdBTCBldCB1biBzY29yZSBwbGF1c2libGUuCgpVU0FHRQogIHB5IC0zLTMyIGVuZzJ1Y2kucHkgIkZyaXR6IDcuZW5nIgogIHB5IC0zLTMyIGVuZzJ1Y2kucHkgLS1jYWxpYiAiRnJpdHogOC5lbmciCiIiIgoKaW1wb3J0IHN5cywgb3MsIGN0eXBlcywgdGhyZWFkaW5nLCBzdHJ1Y3QsIHRpbWUKZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIENvbmZpZyBwYXIgbW90ZXVyIChjbGUgPSB0YWlsbGUgZHUgZmljaGllciAuZW5nIGVuIG9jdGV0cykuIFJWQSA9IGFkcmVzc2UKIyAgYWJzb2x1ZSAtIDB4MTAwMDAwMDAuIGNwID0gbGlzdGUgZGVzIFJWQSBkZSAnamUnIGEgcGFzc2VyIGVuICdqbXAnLgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkVOR0lORVMgPSB7CiAgICAxMjY5NzY6IGRpY3QobmFtZT0iRnJpdHogNS4zMiIsIG5tb3Zlcz0weDE4MDhjLCBzY29yZXM9MHhlOWE4LCBtb3ZlYmFzZT0weDE4Y2MwLAogICAgICAgICAgICAgICAgIHB2PTB4MTBjYzAsIG5vZGU9MHhkNzYwLCBub2RlX2FjY3VtdWxhdGVzPVRydWUsCiAgICAgICAgICAgICAgICAgc3dhcF9zcT1UcnVlLCBtb3ZlYmFzZV9kaXJlY3Q9VHJ1ZSwgY3A9WzB4MmIzNV0pLAogICAgMzExMjk2OiBkaWN0KG5hbWU9IkZyaXR6IDYiLCAgICBubW92ZXM9MHgyY2I4MCwgc2NvcmVzPTB4MmNiODgsIG1vdmViYXNlPTB4MmVjYzQsCiAgICAgICAgICAgICAgICAgcHY9MHgzMTA5Yywgbm9kZT0weDJhNDEwLCBjcD1bMHgzNGE3LCAweDM0ZDFdKSwKICAgIDQzNDE3NjogZGljdChuYW1lPSJGcml0eiA3IiwgICAgbm1vdmVzPTB4MzE1NGMsIHNjb3Jlcz0weDMxNTUwLCBtb3ZlYmFzZT0weDM2MWEwLAogICAgICAgICAgICAgICAgIHB2PTB4MzYxYWMsIG5vZGU9MHgyZTg4MCwgY3A9WzB4NDc2NSwgMHg0NzkwLCAweDQ3YmJdKSwKICAgIDQ3MTA0MDogZGljdChuYW1lPSJGcml0eiA4IiwgICAgbm1vdmVzPTB4MzJiNTQsIHNjb3Jlcz0weDMyYjU4LCBtb3ZlYmFzZT0weDNiM2UwLAogICAgICAgICAgICAgICAgIHB2PTB4M2IzZWMsIG5vZGU9MHgyZmExMCwgY3A9WzB4NDk1MywgMHg0OTdmLCAweDQ5YWIsIDB4NGEyMiwgMHg0YjQ2XSksCiAgICA0NDY0NjQ6IGRpY3QobmFtZT0iRnJpdHogOSIsICAgIG5tb3Zlcz1Ob25lLCBzY29yZXM9Tm9uZSwgbW92ZWJhc2U9Tm9uZSwgcHY9MHg2YzE3MCwKICAgICAgICAgICAgICAgICBiZXN0bW92ZV9kd29yZD0weDg0MzgwLCBzY29yZV9kd29yZD0weDcxZTU0LCBub2RlPTB4NmYzZjAsIHdwZXJzcGVjdGl2ZT1UcnVlLAogICAgICAgICAgICAgICAgIGNwPVsoMHgxMzk0MiwgYiJceDkwIio2KSwgKDB4MTM5NWQsIGIiXHg5MCIqNiksICgweDEzOTkyLCBiIlx4OTAiKjYpLAogICAgICAgICAgICAgICAgICAgICAoMHgxMzlmZCwgYiJceDkwIio2KSwgKDB4MTNhMTUsIGIiXHg5MCIqNiksIDB4MTNiODUsCiAgICAgICAgICAgICAgICAgICAgICgweDEzYzY5LCBiIlx4QjhceDAxXHgwMFx4MDBceDAwIildKSwgICAjIGNoZWNrIENEIC0+ICJDRCBwcmVzZW50IiAobW92IGVheCwxKQp9CiMgb2Zmc2V0cyBkJ2VudHJlZSBjb21tdW5zIChzcGFyYW1zKSBldCBwYXJhbWV0cmVzIGRlIHJlY2hlcmNoZQpCT0FSRF9PRkYsIEZMQUdfT0ZGLCBTSURFX09GRiwgRVBfT0ZGLCBDQVNUTEVfT0ZGID0gMHgxOCwgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YgpNT0RFX09GRiwgSVRFUkRFUFRIX09GRiwgQ0FQREVQVEhfT0ZGID0gMHg4NjIsIDB4ODVlLCAweDg3NApNT0RFX0ZJWEVEX0RFUFRIID0gMgpTRU5USU5FTCA9IC0zMjc2OCAgICAgICAgICAgICAgICAgIyAweGZmZmY4MDAwIDogc2NvcmUgZGUgcmVzZXQKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ0FMSUIgPSBGYWxzZQphcmd2ID0gbGlzdChzeXMuYXJndlsxOl0pCmlmIGFyZ3YgYW5kIGFyZ3ZbMF0gPT0gIi0tY2FsaWIiOgogICAgQ0FMSUIgPSBUcnVlOyBhcmd2ID0gYXJndlsxOl0KRU5HX1BBVEggPSBhcmd2WzBdIGlmIGFyZ3YgZWxzZSAiRnJpdHogNi5lbmciCkhBU0hfTUIgID0gNjQKSEVSRSAgICAgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKTE9HX1BBVEggPSBvcy5wYXRoLmpvaW4oSEVSRSwgImVuZzJ1Y2kubG9nIikKCl9sb2dmID0gb3BlbihMT0dfUEFUSCwgInciLCBidWZmZXJpbmc9MSwgZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikKZGVmIGxvZygqYSk6CiAgICBtID0gIiAiLmpvaW4oc3RyKHgpIGZvciB4IGluIGEpCiAgICBfbG9nZi53cml0ZShtICsgIlxuIikKICAgIGlmIENBTElCOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIltkYmddICIgKyBtICsgIlxuIik7IHN5cy5zdGRlcnIuZmx1c2goKQpkZWYgdWNpX291dChzKToKICAgIHN5cy5zdGRvdXQud3JpdGUocyArICJcbiIpOyBzeXMuc3Rkb3V0LmZsdXNoKCk7IGxvZygiPj4gIiArIHMpCgppZiBjdHlwZXMuc2l6ZW9mKGN0eXBlcy5jX3ZvaWRfcCkgIT0gNDoKICAgIHN5cy5zdGRlcnIud3JpdGUoIkZBVEFMOiBQeXRob24gMzIgYml0cyByZXF1aXMgKHB5IC0zLTMyKS5cbiIpOyBzeXMuZXhpdCgxKQppZiBub3Qgb3MucGF0aC5leGlzdHMoRU5HX1BBVEgpOgogICAgc3lzLnN0ZGVyci53cml0ZShmIkZBVEFMOiB7RU5HX1BBVEh9IGludHJvdXZhYmxlXG4iKTsgc3lzLmV4aXQoMSkKClNJWkUgPSBvcy5wYXRoLmdldHNpemUoRU5HX1BBVEgpCkNGRyA9IEVOR0lORVMuZ2V0KFNJWkUpCmlmIENGRyBpcyBOb25lOgogICAgc3lzLnN0ZGVyci53cml0ZShmIkZBVEFMOiB0YWlsbGUge1NJWkV9IG5vbiByZWNvbm51ZS4gTW90ZXVycyBjb25udXMgOiAiCiAgICAgICAgICAgICAgICAgICAgICsgIiwgIi5qb2luKGYie3ZbJ25hbWUnXX0oe2t9KSIgZm9yIGssIHYgaW4gRU5HSU5FUy5pdGVtcygpKSArICJcbiIpCiAgICBzeXMuZXhpdCgxKQpsb2coZiJtb3RldXIgZGV0ZWN0ZSA6IHtDRkdbJ25hbWUnXX0gKHRhaWxsZSB7U0laRX0pIikKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KazMyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMgprMzIuTG9hZExpYnJhcnlBLnJlc3R5cGUgICA9IHdpbnR5cGVzLkhNT0RVTEUKazMyLkxvYWRMaWJyYXJ5QS5hcmd0eXBlcyAgPSBbd2ludHlwZXMuTFBDU1RSXQprMzIuR2V0UHJvY0FkZHJlc3MucmVzdHlwZSA9IGN0eXBlcy5jX3ZvaWRfcAprMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXM9IFt3aW50eXBlcy5ITU9EVUxFLCB3aW50eXBlcy5MUENTVFJdCmszMi5WaXJ0dWFsUHJvdGVjdC5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAprMzIuVmlydHVhbFByb3RlY3QuYXJndHlwZXM9IFtjdHlwZXMuY192b2lkX3AsIGN0eXBlcy5jX3NpemVfdCwgd2ludHlwZXMuRFdPUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5QT0lOVEVSKHdpbnR5cGVzLkRXT1JEKV0KUEFHRV9SV1ggPSAweDQwCmRlZiBwYXRjaF9ieXRlcyhhZGRyLCBkYXRhKToKICAgIG9sZCA9IHdpbnR5cGVzLkRXT1JEKDApCiAgICBrMzIuVmlydHVhbFByb3RlY3QoYWRkciwgbGVuKGRhdGEpLCBQQUdFX1JXWCwgY3R5cGVzLmJ5cmVmKG9sZCkpCiAgICBjdHlwZXMubWVtbW92ZShhZGRyLCBkYXRhLCBsZW4oZGF0YSkpCiAgICBrMzIuVmlydHVhbFByb3RlY3QoYWRkciwgbGVuKGRhdGEpLCBvbGQudmFsdWUsIGN0eXBlcy5ieXJlZihvbGQpKQogICAgazMyLkZsdXNoSW5zdHJ1Y3Rpb25DYWNoZShrMzIuR2V0Q3VycmVudFByb2Nlc3MoKSwgYWRkciwgbGVuKGRhdGEpKQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojICBFY2hpcXVpZXIgaW50ZXJuZSAocmFuay1tYWpvciBzdGFuZGFyZCBhMT0wKSAtPiBlbmNvZGFnZSBmaWxlLW1ham9yIG1vdGV1cgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkZJTEVTID0gImFiY2RlZmdoIgpkZWYgdWNpX3NxX3RvX2lkeChzKTogcmV0dXJuIChpbnQoc1sxXSkgLSAxKSAqIDggKyBGSUxFUy5pbmRleChzWzBdKQpTVEFSVF9GRU4gPSAicm5icWtibnIvcHBwcHBwcHAvOC84LzgvOC9QUFBQUFBQUC9STkJRS0JOUiB3IEtRa3EgLSAwIDEiCgpjbGFzcyBCb2FyZDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnNxID0gWycuJ10gKiA2NDsgc2VsZi53aGl0ZSA9IFRydWU7IHNlbGYuY2FzdGxlID0gc2V0KCk7IHNlbGYuZXAgPSBOb25lCiAgICBkZWYgc2V0X2ZlbihzZWxmLCBmZW4pOgogICAgICAgIHBhcnRzID0gZmVuLnNwbGl0KCk7IHJvd3MgPSBwYXJ0c1swXS5zcGxpdCgnLycpOyBzZWxmLnNxID0gWycuJ10gKiA2NAogICAgICAgIGZvciByIGluIHJhbmdlKDgpOgogICAgICAgICAgICByYW5rID0gNyAtIHI7IGYgPSAwCiAgICAgICAgICAgIGZvciBjIGluIHJvd3Nbcl06CiAgICAgICAgICAgICAgICBpZiBjLmlzZGlnaXQoKTogZiArPSBpbnQoYykKICAgICAgICAgICAgICAgIGVsc2U6IHNlbGYuc3FbcmFuayo4ICsgZl0gPSBjOyBmICs9IDEKICAgICAgICBzZWxmLndoaXRlID0gKGxlbihwYXJ0cykgPCAyIG9yIHBhcnRzWzFdID09ICd3JykKICAgICAgICBzZWxmLmNhc3RsZSA9IHNldChjIGZvciBjIGluIChwYXJ0c1syXSBpZiBsZW4ocGFydHMpID4gMiBlbHNlICcnKSBpZiBjIGluICdLUWtxJykKICAgICAgICBzZWxmLmVwID0gdWNpX3NxX3RvX2lkeChwYXJ0c1szXSkgaWYgKGxlbihwYXJ0cykgPiAzIGFuZCBwYXJ0c1szXSAhPSAnLScpIGVsc2UgTm9uZQogICAgZGVmIGFwcGx5X3VjaShzZWxmLCBtdik6CiAgICAgICAgZnJtID0gdWNpX3NxX3RvX2lkeChtdlswOjJdKTsgdG8gPSB1Y2lfc3FfdG9faWR4KG12WzI6NF0pCiAgICAgICAgcHJvbW8gPSBtdls0XSBpZiBsZW4obXYpID4gNCBlbHNlIE5vbmUKICAgICAgICBwYyA9IHNlbGYuc3FbZnJtXTsgc2VsZi5zcVtmcm1dID0gJy4nCiAgICAgICAgaWYgcGMgaW4gJ1BwJyBhbmQgdG8gPT0gc2VsZi5lcCBhbmQgc2VsZi5zcVt0b10gPT0gJy4nOgogICAgICAgICAgICBzZWxmLnNxW3RvIC0gOCBpZiBwYyA9PSAnUCcgZWxzZSB0byArIDhdID0gJy4nCiAgICAgICAgaWYgcGMgPT0gJ0snIGFuZCBmcm0gPT0gNCBhbmQgdG8gPT0gNjogICBzZWxmLnNxWzVdID0gc2VsZi5zcVs3XTsgc2VsZi5zcVs3XSA9ICcuJwogICAgICAgIGlmIHBjID09ICdLJyBhbmQgZnJtID09IDQgYW5kIHRvID09IDI6ICAgc2VsZi5zcVszXSA9IHNlbGYuc3FbMF07IHNlbGYuc3FbMF0gPSAnLicKICAgICAgICBpZiBwYyA9PSAnaycgYW5kIGZybSA9PSA2MCBhbmQgdG8gPT0gNjI6IHNlbGYuc3FbNjFdID0gc2VsZi5zcVs2M107IHNlbGYuc3FbNjNdID0gJy4nCiAgICAgICAgaWYgcGMgPT0gJ2snIGFuZCBmcm0gPT0gNjAgYW5kIHRvID09IDU4OiBzZWxmLnNxWzU5XSA9IHNlbGYuc3FbNTZdOyBzZWxmLnNxWzU2XSA9ICcuJwogICAgICAgIHNlbGYuZXAgPSBOb25lCiAgICAgICAgaWYgcGMgPT0gJ1AnIGFuZCB0byAtIGZybSA9PSAxNjogc2VsZi5lcCA9IGZybSArIDgKICAgICAgICBpZiBwYyA9PSAncCcgYW5kIGZybSAtIHRvID09IDE2OiBzZWxmLmVwID0gZnJtIC0gOAogICAgICAgIGlmIHByb21vOiBwYyA9IHByb21vLnVwcGVyKCkgaWYgcGMgPT0gJ1AnIGVsc2UgcHJvbW8ubG93ZXIoKQogICAgICAgIHNlbGYuc3FbdG9dID0gcGMKICAgICAgICBmb3IgcywgY3MgaW4gKCg0LCAnS1EnKSwgKDYwLCAna3EnKSk6CiAgICAgICAgICAgIGlmIGZybSA9PSBzOgogICAgICAgICAgICAgICAgZm9yIHggaW4gY3M6IHNlbGYuY2FzdGxlLmRpc2NhcmQoeCkKICAgICAgICBmb3IgcywgYyBpbiAoKDcsICdLJyksICgwLCAnUScpLCAoNjMsICdrJyksICg1NiwgJ3EnKSk6CiAgICAgICAgICAgIGlmIGZybSA9PSBzIG9yIHRvID09IHM6IHNlbGYuY2FzdGxlLmRpc2NhcmQoYykKICAgICAgICBzZWxmLndoaXRlID0gbm90IHNlbGYud2hpdGUKClJBVyA9IHsnSyc6MSwnUSc6MiwnTic6MywnQic6NCwnUic6NSwnUCc6NiwKICAgICAgICdrJzo5LCdxJzoxMCwnbic6MTEsJ2InOjEyLCdyJzoxMywncCc6MTQsICcuJzowfQpkZWYgYm9hcmRfdG9fZW5naW5lKGJkLCBzcCk6CiAgICBmb3IgcmFuayBpbiByYW5nZSg4KToKICAgICAgICBmb3IgZiBpbiByYW5nZSg4KToKICAgICAgICAgICAgc3BbQk9BUkRfT0ZGICsgZio4ICsgcmFua10gPSBSQVdbYmQuc3FbcmFuayo4ICsgZl1dICAgICAjIGZpbGUtbWFqb3IKICAgIHNwW0ZMQUdfT0ZGXSA9IDAKICAgIHNwW1NJREVfT0ZGXSA9IDAgaWYgYmQud2hpdGUgZWxzZSAxCiAgICBzcFtFUF9PRkZdICAgPSAwCiAgICBjciA9IDAKICAgIGlmICdRJyBpbiBiZC5jYXN0bGU6IGNyIHw9IDB4MDEKICAgIGlmICdLJyBpbiBiZC5jYXN0bGU6IGNyIHw9IDB4MDIKICAgIGlmICdxJyBpbiBiZC5jYXN0bGU6IGNyIHw9IDB4MDQKICAgIGlmICdrJyBpbiBiZC5jYXN0bGU6IGNyIHw9IDB4MDgKICAgIHNwW0NBU1RMRV9PRkZdID0gY3IKICAgIGlmIENBTElCOgogICAgICAgIGxvZyhmImZlZWQgc2lkZT17c3BbU0lERV9PRkZdfSBjYXN0bGU9e2NyOiN4fSBhMT17c3BbQk9BUkRfT0ZGXX0gIgogICAgICAgICAgICBmImUxPXtzcFtCT0FSRF9PRkYrMzJdfSBlMj17c3BbQk9BUkRfT0ZGKzMzXX0gZTg9e3NwW0JPQVJEX09GRiszOV19IikKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgU3R1YiBDaGVzczMyLmRsbCArIGNhbGxiYWNrCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQ0JfVFlQRSA9IGN0eXBlcy5DRlVOQ1RZUEUoY3R5cGVzLmNfaW50LCBjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLmNfaW50LCBjdHlwZXMuY192b2lkX3ApCnN0dWIgPSBvcy5wYXRoLmpvaW4oSEVSRSwgIkNoZXNzMzIuZGxsIikKaWYgbm90IG9zLnBhdGguZXhpc3RzKHN0dWIpOgogICAgc3lzLnN0ZGVyci53cml0ZSgiRkFUQUw6IENoZXNzMzIuZGxsIChzdHViKSBhYnNlbnQgYSBjb3RlIGRlIGVuZzJ1Y2kucHlcbiIpOyBzeXMuZXhpdCgxKQpoU3R1YiA9IGszMi5Mb2FkTGlicmFyeUEoc3R1Yi5lbmNvZGUoKSkKX3NldF9jYiA9IGN0eXBlcy5DRlVOQ1RZUEUoTm9uZSwgQ0JfVFlQRSkoazMyLkdldFByb2NBZGRyZXNzKGhTdHViLCBiIkNoZXNzMzJfU2V0Q2FsbGJhY2siKSkKCmNsYXNzIFN0OiBiZXN0PU5vbmU7IGRlcHRoPTA7IHNjb3JlPTA7IHNlYXJjaGluZz1GYWxzZTsgdDA9MC4wOyBsYXN0X2VtaXQ9Tm9uZTsgYmVzdF9wdj1Ob25lOyByZXFfZGVwdGg9MDsgbm9kZTA9MDsgYmVzdF9zY29yZV9zZWVuPS0yMDAwMDAwMDAwOyBhcmdtYXhfZGVwdGg9LTEKc3QgPSBTdCgpCgpkZWYgc3Ffb3V0KHNxKTogICAgICAgICAgICAgICAgICAjIFNPUlRJRSA6IGZpbGUtbWFqb3IKICAgIHNxICY9IDB4M0YKICAgIHJldHVybiBGSUxFU1tzcSA+PiAzXSArIHN0cigoc3EgJiA3KSArIDEpCgojIGVudHJlZSBkZSBjb3VwIDQgb2N0ZXRzLiBQcm9tb3Rpb24gOiBiaXQ3IGQndW4gb2N0ZXQgZGUgZmxhZ3MsIChmbGFncz4+NSkmMyAtPgojIDA9QyAxPUQgMj1UIDM9RiAoaWRlbnRpcXVlIHN1ciBsZXMgNCkuIDYvNy84IDogZmxhZ3M9Ynl0ZTIsIGNhc2VzIGZpbGUtbWFqb3IuCiMgNS4zMiA6IGZsYWdzPWJ5dGUzLCBjYXNlcyByYW5rLW1ham9yIChiaXRzIGVjaGFuZ2VzKS4KUFJPTU9fVEJMID0gWyJuIiwgInEiLCAiciIsICJiIl0KZGVmIGRlY29kZV9tb3ZlKGVudHJ5KToKICAgIGZybSA9IGVudHJ5ICYgMHhGRjsgdG8gPSAoZW50cnkgPj4gOCkgJiAweEZGCiAgICBpZiBDRkcuZ2V0KCdzd2FwX3NxJyk6ICAgICAgICAgICAgICAgICAgICAgICAjIDUuMzIKICAgICAgICBmcm0gPSAoKGZybSAmIDcpIDw8IDMpIHwgKChmcm0gPj4gMykgJiA3KQogICAgICAgIHRvICA9ICgodG8gICYgNykgPDwgMykgfCAoKHRvICA+PiAzKSAmIDcpCiAgICAgICAgZmxhZ3MgPSAoZW50cnkgPj4gMjQpICYgMHhGRgogICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA2LzcvOAogICAgICAgIGZsYWdzID0gKGVudHJ5ID4+IDE2KSAmIDB4RkYKICAgIHByb21vID0gUFJPTU9fVEJMWyhmbGFncyA+PiA1KSAmIDNdIGlmIChmbGFncyAmIDB4ODApIGVsc2UgIiIKICAgIGlmIGZybSA9PSB0byBvciBmcm0gPiA2MyBvciB0byA+IDYzOgogICAgICAgIHJldHVybiBOb25lCiAgICByZXR1cm4gc3Ffb3V0KGZybSkgKyBzcV9vdXQodG8pICsgcHJvbW8KCmRlZiBob3N0X2NhbGxiYWNrKG1zZywgYTEsIGEyLCBjdHgpOgogICAgdHJ5OgogICAgICAgIGlmIENBTElCOiBsb2coZiJNU0cge21zZzojeH0gYTE9e2ExfSBhMj17YTJ9IGN0eD17Y3R4IGlmIGN0eCBlbHNlIDA6I3h9IikKICAgICAgICBpZiBtc2cgPT0gMHgxNTg6ICAgICAgICAgICAgICAgICAgICAgIyBwcm9mb25kZXVyIChyYXBwb3J0IHNvdXZlbnQgdGhyb3R0bGUpCiAgICAgICAgICAgIGQgPSAwCiAgICAgICAgICAgIGlmIGN0eDoKICAgICAgICAgICAgICAgIHRyeTogZCA9IHN0cnVjdC51bnBhY2soIjxIIiwgKGN0eXBlcy5jX3VieXRlKjIpLmZyb21fYWRkcmVzcyhjdHggKyAweDE0KSlbMF0KICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IGQgPSAwCiAgICAgICAgICAgIGlmIDAgPCBkIDwgMjAwOiBzdC5kZXB0aCA9IG1heChzdC5kZXB0aCwgZCkKICAgICAgICAgICAgZWxzZTogICAgICAgICAgIHN0LmRlcHRoICs9IDEKICAgICAgICAgICAgaWYgQ0FMSUI6IGxvZyhmIlsxNThdIGN0eFsweDE0XT17ZH0gLT4gZGVwdGg9e3N0LmRlcHRofSIpCiAgICAgICAgZWxpZiBtc2cgPT0gMHgxNTQ6ICAgICAgICAgICAgICAgICAgICMgcmFwcG9ydCBzY29yZS9QViAoZnJlcXVlbnQgOiBwcm9mb25kZXVyIGN0eFsweDI3NmNdKQogICAgICAgICAgICBpZiBjdHg6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZCA9IHN0cnVjdC51bnBhY2soIjxIIiwgKGN0eXBlcy5jX3VieXRlKjIpLmZyb21fYWRkcmVzcyhjdHggKyAweDI3NmMpKVswXQogICAgICAgICAgICAgICAgICAgIGlmIDAgPCBkIDwgMjAwOiBzdC5kZXB0aCA9IG1heChzdC5kZXB0aCwgZCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IHBhc3MKICAgICAgICAgICAgZW1pdF9pbmZvKCkKICAgICAgICAjIDB4MTU2IC8gMHgxNTcgOiBwZXJpb2RpcXVlcyAtPiBpZ25vcmVzIChsYSBmaW4gPSByZXRvdXIgZGUgRW5nOSkKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2coImNhbGxiYWNrIEVYQzoiLCByZXByKGUpKQogICAgcmV0dXJuIDAKX2NiID0gQ0JfVFlQRShob3N0X2NhbGxiYWNrKQpfc2V0X2NiKF9jYikKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgQ2hhcmdlciBsZSAuZW5nLCBwYXRjaGVyIENQLCByZXNvdWRyZSBleHBvcnRzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaEVuZyA9IGszMi5Mb2FkTGlicmFyeUEoRU5HX1BBVEguZW5jb2RlKCkpCmlmIG5vdCBoRW5nOgogICAgc3lzLnN0ZGVyci53cml0ZShmIkZBVEFMOiBMb2FkTGlicmFyeSh7RU5HX1BBVEh9KSBlY2hlYyBlcnI9e2N0eXBlcy5nZXRfbGFzdF9lcnJvcigpfVxuIik7IHN5cy5leGl0KDEpCkJBU0UgPSBoRW5nCmZvciBjIGluIENGR1snY3AnXToKICAgIGlmIGlzaW5zdGFuY2UoYywgdHVwbGUpOgogICAgICAgIHJ2YSwgcGF0Y2ggPSBjCiAgICAgICAgcGF0Y2hfYnl0ZXMoQkFTRSArIHJ2YSwgcGF0Y2gpICAgICAgICAgICMgZXguIGpuZSAtPiBOT1AgKDYgb2N0ZXRzKQogICAgZWxzZToKICAgICAgICBwYXRjaF9ieXRlcyhCQVNFICsgYywgYiJceEVCIikgICAgICAgICAgICMgamUgKDB4NzQpIC0+IGptcCAoMHhFQikKbG9nKGYie0NGR1snbmFtZSddfSBiYXNlPXtCQVNFOiMwMTB4fSA7IHtsZW4oQ0ZHWydjcCddKX0gcGF0Y2gocykgQ1AgcG9zZXMiKQoKZGVmIEEocnZhKTogcmV0dXJuIEJBU0UgKyBydmEgICAgICAgICAgICAjIFJWQSAtPiBhZHJlc3NlIGFic29sdWUKZGVmIF9yZDMyKGEpOiAgcmV0dXJuIHN0cnVjdC51bnBhY2soIjxJIiwgKGN0eXBlcy5jX3VieXRlKjQpLmZyb21fYWRkcmVzcyhhKSlbMF0KZGVmIF9yZHMzMihhKTogcmV0dXJuIHN0cnVjdC51bnBhY2soIjxpIiwgKGN0eXBlcy5jX3VieXRlKjQpLmZyb21fYWRkcmVzcyhhKSlbMF0KCmRlZiByZWFkX25vZGVzKCk6CiAgICBpZiBub3QgQ0ZHWydub2RlJ106IHJldHVybiAwCiAgICB0cnk6CiAgICAgICAgcmF3ID0gX3JkMzIoQShDRkdbJ25vZGUnXSkpIHwgKF9yZDMyKEEoQ0ZHWydub2RlJ10rNCkpIDw8IDMyKQogICAgICAgIHJldHVybiBtYXgoMCwgcmF3IC0gc3Qubm9kZTApICAgICAgICAjIG5vZGUwPTAgc2F1ZiA1LjMyIChjb21wdGV1ciBjdW11bGF0aWYpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAwCgpkZWYgcmVhZF9ub2Rlc19yYXcoKToKICAgIHRyeTogcmV0dXJuIF9yZDMyKEEoQ0ZHWydub2RlJ10pKSB8IChfcmQzMihBKENGR1snbm9kZSddKzQpKSA8PCAzMikKICAgIGV4Y2VwdCBFeGNlcHRpb246IHJldHVybiAwCgpkZWYgcmVhZF9wdihtYXhsZW49MTIpOgogICAgb3V0ID0gW10KICAgIGlmIG5vdCBDRkdbJ3B2J106IHJldHVybiBvdXQKICAgIHRyeToKICAgICAgICBmb3IgaSBpbiByYW5nZShtYXhsZW4pOgogICAgICAgICAgICBtdiA9IGRlY29kZV9tb3ZlKF9yZDMyKEEoQ0ZHWydwdiddKSArIDQqaSkpCiAgICAgICAgICAgIGlmIG12IGlzIE5vbmU6IGJyZWFrCiAgICAgICAgICAgIG91dC5hcHBlbmQobXYpCiAgICBleGNlcHQgRXhjZXB0aW9uOiBwYXNzCiAgICByZXR1cm4gb3V0CgpkZWYgcmVhZF9iZXN0X21vdmUoKToKICAgICIiIk1laWxsZXVyIGNvdXAuIEF2ZWMgdGFibGVhdSBkZSBzY29yZXMgOiBhcmdtYXggKGZpYWJsZSkgKyBzdC5zY29yZS4KICAgICAgIFNpbm9uICg1LjMyKSA6IFBWWzBdLCBzY29yZSBpbmNvbm51ICgwKS4iIiIKICAgIHRyeToKICAgICAgICBpZiBDRkcuZ2V0KCdiZXN0bW92ZV9kd29yZCcpOiAgICAgICAgIyBGcml0eiA5IDogbWVpbGxldXIgY291cCArIHNjb3JlIFNUQUJMRVMKICAgICAgICAgICAgc3Quc2NvcmUgPSBzdHJ1Y3QudW5wYWNrKCI8aSIsIChjdHlwZXMuY191Ynl0ZSo0KS5mcm9tX2FkZHJlc3MoQShDRkdbJ3Njb3JlX2R3b3JkJ10pKSlbMF0KICAgICAgICAgICAgaWYgQ0ZHLmdldCgnd3BlcnNwZWN0aXZlJykgYW5kIG5vdCBib2FyZC53aGl0ZToKICAgICAgICAgICAgICAgIHN0LnNjb3JlID0gLXN0LnNjb3JlCiAgICAgICAgICAgIG12ID0gZGVjb2RlX21vdmUoX3JkMzIoQShDRkdbJ2Jlc3Rtb3ZlX2R3b3JkJ10pKSkKICAgICAgICAgICAgaWYgQ0FMSUI6IGxvZyhmInJlYWRfYmVzdChmOSk6IHNjPXtzdC5zY29yZX0gd2hpdGU9e2JvYXJkLndoaXRlfSAtPiB7bXZ9IikKICAgICAgICAgICAgcmV0dXJuIG12CiAgICAgICAgaWYgQ0ZHWydzY29yZXMnXSBhbmQgQ0ZHWydubW92ZXMnXSBhbmQgQ0ZHWydtb3ZlYmFzZSddOgogICAgICAgICAgICBuID0gX3JkMzIoQShDRkdbJ25tb3ZlcyddKSkKICAgICAgICAgICAgIyA2LzcvOCA6IGxlIGdsb2JhbCBNT1ZFQkFTRSBlc3QgdW4gUE9JTlRFVVIgdmVycyBsZSB0YWJsZWF1IChkZXJlZikuCiAgICAgICAgICAgICMgNS4zMiAgOiBsZSBnbG9iYWwgRVNUIGxlIHRhYmxlYXUgKGluZGV4YXRpb24gZGlyZWN0ZSwgcGFzIGRlIGRlcmVmKS4KICAgICAgICAgICAgYmFzZSA9IEEoQ0ZHWydtb3ZlYmFzZSddKSBpZiBDRkcuZ2V0KCdtb3ZlYmFzZV9kaXJlY3QnKSBlbHNlIF9yZDMyKEEoQ0ZHWydtb3ZlYmFzZSddKSkKICAgICAgICAgICAgaWYgYmFzZSA+IDB4MTAwMDAgYW5kIDEgPD0gbiA8PSAyNTY6ICAgIyBnYXJkZS1mb3UgOiBhZHJlc3NlIHBsYXVzaWJsZQogICAgICAgICAgICAgICAgYmksIGJzID0gMCwgLSgxIDw8IDMwKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CiAgICAgICAgICAgICAgICAgICAgc2MgPSBfcmRzMzIoQShDRkdbJ3Njb3JlcyddKSArIDQqaSkKICAgICAgICAgICAgICAgICAgICBpZiBzYyA+IGJzOiBicywgYmkgPSBzYywgaQogICAgICAgICAgICAgICAgZW50cnkgPSBfcmQzMihiYXNlICsgNCpiaSkKICAgICAgICAgICAgICAgIHN0LnNjb3JlID0gYnMKICAgICAgICAgICAgICAgIG12ID0gZGVjb2RlX21vdmUoZW50cnkpCiAgICAgICAgICAgICAgICBpZiBDQUxJQjoKICAgICAgICAgICAgICAgICAgICBsb2coZiJyZWFkX2Jlc3Q6IG49e259IGJpPXtiaX0gc2M9e2JzfSBlbnRyeT17ZW50cnk6IzAxMHh9IC0+IHttdn0iKQogICAgICAgICAgICAgICAgcmV0dXJuIG12CiAgICAgICAgcHYgPSByZWFkX3B2KCkgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGkgKDUuMzIgLyBGcml0eiA5KSA6IGJlc3Rtb3ZlID0gUFZbMF0KICAgICAgICBpZiBDRkcuZ2V0KCdzY29yZV9kd29yZCcpOgogICAgICAgICAgICBzdC5zY29yZSA9IHN0cnVjdC51bnBhY2soIjxpIiwgKGN0eXBlcy5jX3VieXRlKjQpLmZyb21fYWRkcmVzcyhBKENGR1snc2NvcmVfZHdvcmQnXSkpKVswXQogICAgICAgIGVsaWYgQ0ZHLmdldCgnc2NvcmVfd29yZCcpOgogICAgICAgICAgICBzdC5zY29yZSA9IHN0cnVjdC51bnBhY2soIjxoIiwgKGN0eXBlcy5jX3VieXRlKjIpLmZyb21fYWRkcmVzcyhBKENGR1snc2NvcmVfd29yZCddKSkpWzBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3Quc2NvcmUgPSAwCiAgICAgICAgaWYgQ0ZHLmdldCgnd3BlcnNwZWN0aXZlJykgYW5kIG5vdCBib2FyZC53aGl0ZTogICAjIHNjb3JlIGFic29sdSBCbGFuY3MgLT4gdHJhaXQKICAgICAgICAgICAgc3Quc2NvcmUgPSAtc3Quc2NvcmUKICAgICAgICBpZiBwdjoKICAgICAgICAgICAgaWYgQ0FMSUI6IGxvZyhmInJlYWRfYmVzdChwdik6IHtwdlswXX0gc2M9e3N0LnNjb3JlfSB3aGl0ZT17Ym9hcmQud2hpdGV9IikKICAgICAgICAgICAgcmV0dXJuIHB2WzBdCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgbG9nKCJyZWFkX2Jlc3QgRVhDOiIsIHJlcHIoZSkpCiAgICByZXR1cm4gTm9uZQoKZGVmIGVtaXRfaW5mbyhmaW5hbD1GYWxzZSk6CiAgICBiZXN0ID0gcmVhZF9iZXN0X21vdmUoKSAgICAgICAgICAgICAgICAgICMgYXJnbWF4IChmaWFibGUpIDsgbWV0IGEgam91ciBzdC5zY29yZQogICAgaWYgYmVzdCBpcyBOb25lIGFuZCBub3QgZmluYWw6IHJldHVybgogICAgc2MgPSBzdC5zY29yZQogICAgaWYgc2MgPT0gU0VOVElORUwgYW5kIG5vdCBmaW5hbDogcmV0dXJuCiAgICBwdiA9IHJlYWRfcHYoKSBpZiBDRkdbJ3B2J10gZWxzZSBbXQogICAgaWYgbm90IENGR1snc2NvcmVzJ10gYW5kIENGR1sncHYnXSBhbmQgbm90IENGRy5nZXQoJ2Jlc3Rtb3ZlX2R3b3JkJyk6CiAgICAgICAgIyAoYnJhbmNoZSBhcmdtYXggaGlzdG9yaXF1ZSAtIHBsdXMgdXRpbGlzZWUgOiA1LjMyIGEgZGVzIHNjb3JlcywgRjkgYSBiZXN0bW92ZV9kd29yZCkKICAgICAgICBpZiBzdC5kZXB0aCAhPSBzdC5hcmdtYXhfZGVwdGg6CiAgICAgICAgICAgIHN0LmFyZ21heF9kZXB0aCA9IHN0LmRlcHRoOyBzdC5iZXN0X3Njb3JlX3NlZW4gPSAtMjAwMDAwMDAwMAogICAgICAgIGlmIHB2IGFuZCBzYyA+IHN0LmJlc3Rfc2NvcmVfc2VlbjoKICAgICAgICAgICAgc3QuYmVzdF9wdiA9IHB2OyBzdC5iZXN0X3Njb3JlX3NlZW4gPSBzYwogICAgICAgIGlmIGZpbmFsIGFuZCBwdiBhbmQgKG5vdCBzdC5iZXN0X3B2IG9yIHNjID4gc3QuYmVzdF9zY29yZV9zZWVuKToKICAgICAgICAgICAgc3QuYmVzdF9wdiA9IHB2OyBzdC5iZXN0X3Njb3JlX3NlZW4gPSBzYwogICAgICAgIGlmIG5vdCBzdC5iZXN0X3B2OiByZXR1cm4KICAgICAgICBsaW5lID0gc3QuYmVzdF9wdjsgYmVzdCA9IGxpbmVbMF07IHNjID0gc3QuYmVzdF9zY29yZV9zZWVuCiAgICBlbGlmIHB2IGFuZCBiZXN0IGFuZCBwdlswXSA9PSBiZXN0OiAgICAgICMgdnJhaWUgbWVpbGxldXJlIGxpZ25lICg1LjMyLzYvNy84LzkpCiAgICAgICAgaWYgbGVuKHB2KSA+IDE6IHN0LmJlc3RfcHYgPSBwdgogICAgICAgIGxpbmUgPSBzdC5iZXN0X3B2IGlmIChzdC5iZXN0X3B2IGFuZCBzdC5iZXN0X3B2WzBdID09IGJlc3QpIGVsc2UgcHYKICAgIGVsaWYgQ0ZHWydwdiddIGFuZCBub3QgZmluYWw6ICAgICAgICAgICAgIyByYXBwb3J0ICJjb3VwIGNvdXJhbnQiIC0+IHNhdXRlCiAgICAgICAgcmV0dXJuCiAgICBlbGlmIGJlc3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFzIGRlIHRhYmxlIFBWICg1LjMyKSBvdSBmaW5hbCAtPiBjb3VwIHNldWwKICAgICAgICBsaW5lID0gc3QuYmVzdF9wdiBpZiAoc3QuYmVzdF9wdiBhbmQgc3QuYmVzdF9wdlswXSA9PSBiZXN0KSBlbHNlIFtiZXN0XQogICAgZWxzZToKICAgICAgICByZXR1cm4KICAgIGtleSA9IChzdC5kZXB0aCwgYmVzdCwgc2MsIHR1cGxlKGxpbmUpKQogICAgaWYga2V5ID09IHN0Lmxhc3RfZW1pdCBhbmQgbm90IGZpbmFsOiByZXR1cm4KICAgIHN0Lmxhc3RfZW1pdCA9IGtleQogICAgbm9kZXMgPSByZWFkX25vZGVzKCk7IG1zID0gbWF4KDEsIGludCgodGltZS50aW1lKCkgLSBzdC50MCkgKiAxMDAwKSkKICAgIHN0LmJlc3QgPSBiZXN0CiAgICBkc2hvd24gPSBzdC5kZXB0aCBpZiBzdC5kZXB0aCA+IDAgZWxzZSAoc3QucmVxX2RlcHRoIG9yIDEpCiAgICBzY3N0ciA9IGYiY3Age3NjfSIgaWYgc2MgIT0gU0VOVElORUwgZWxzZSAiY3AgMCIKICAgIG5zdHIgPSBmIm5vZGVzIHtub2Rlc30gbnBzIHtub2RlcyAqIDEwMDAgLy8gbXN9ICIgaWYgbm9kZXMgZWxzZSAiIgogICAgdWNpX291dChmImluZm8gZGVwdGgge2RzaG93bn0gc2NvcmUge3Njc3RyfSB7bnN0cn10aW1lIHttc30gcHYgIiArICIgIi5qb2luKGxpbmUpKQoKVlAgPSBjdHlwZXMuY192b2lkX3AKZGVmIGV4cG9ydChuYW1lLCBydCwgYXQsIHJlcXVpcmVkPVRydWUpOgogICAgcCA9IGszMi5HZXRQcm9jQWRkcmVzcyhoRW5nLCBuYW1lLmVuY29kZSgpKQogICAgaWYgbm90IHA6CiAgICAgICAgaWYgcmVxdWlyZWQ6IHN5cy5zdGRlcnIud3JpdGUoZiJGQVRBTDogZXhwb3J0IHtuYW1lfSBhYnNlbnRcbiIpOyBzeXMuZXhpdCgxKQogICAgICAgIGxvZyhmIm5vdGU6IGV4cG9ydCBvcHRpb25uZWwge25hbWV9IGFic2VudCIpOyByZXR1cm4gTm9uZQogICAgcmV0dXJuIGN0eXBlcy5DRlVOQ1RZUEUocnQsICphdCkocCkKRW5nMSAgPSBleHBvcnQoIkVuZzEiLCAgY3R5cGVzLmNfaW50LCBbVlAsVlAsVlAsVlAsVlAsIGN0eXBlcy5jX3VpbnRdKQpFbmcyICA9IGV4cG9ydCgiRW5nMiIsICBOb25lLCBbXSwgcmVxdWlyZWQ9RmFsc2UpCkVuZzMgID0gZXhwb3J0KCJFbmczIiwgIE5vbmUsIFtdLCByZXF1aXJlZD1GYWxzZSkKRW5nNCAgPSBleHBvcnQoIkVuZzQiLCAgY3R5cGVzLmNfaW50LCBbXSwgcmVxdWlyZWQ9RmFsc2UpCkVuZzYgID0gZXhwb3J0KCJFbmc2IiwgIGN0eXBlcy5jX2NoYXJfcCwgW10sIHJlcXVpcmVkPUZhbHNlKQpFbmc3ICA9IGV4cG9ydCgiRW5nNyIsICBjdHlwZXMuY19jaGFyX3AsIFtdLCByZXF1aXJlZD1GYWxzZSkKRW5nOCAgPSBleHBvcnQoIkVuZzgiLCAgY3R5cGVzLmNfdWludCwgW10sIHJlcXVpcmVkPUZhbHNlKQpFbmc5ICA9IGV4cG9ydCgiRW5nOSIsICBOb25lLCBbVlBdKQpFbmcxNSA9IGV4cG9ydCgiRW5nMTUiLCBOb25lLCBbXSwgcmVxdWlyZWQ9RmFsc2UpCgpDVFggPSAweDMwMDAKY3R4ID0gW2N0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcihDVFgpIGZvciBfIGluIHJhbmdlKDUpXQpjdHhfcHRyID0gW2N0eXBlcy5jYXN0KGIsIGN0eXBlcy5jX3ZvaWRfcCkudmFsdWUgZm9yIGIgaW4gY3R4XQpzcGFyYW1zID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDB4MTAwMCkKU1AgPSBjdHlwZXMuY2FzdChzcGFyYW1zLCBjdHlwZXMuY192b2lkX3ApLnZhbHVlCgpFTkdfTkFNRSAgID0gQ0ZHWyduYW1lJ10gICAgICAgICAgICAjIGFmZmljaGUgZGVzIGxlICd1Y2knIChpbml0IHJlZWxsZSBkaWZmZXJlZSkKRU5HX0FVVEhPUiA9ICJGcmFucyBNb3JzY2giCl9pbml0ZWQgPSBGYWxzZQoKZGVmIGVuc3VyZV9pbml0KCk6CiAgICAjIEluaXQgcmVlbGxlIGR1IG1vdGV1ciA6IGFwcGVsZWUgYXUgMWVyIGlzcmVhZHkvZ28sIEFQUkVTIGxlcyBzZXRvcHRpb24KICAgICMgKHBlcm1ldCBkJ2FwcGxpcXVlciBsYSB0YWlsbGUgZGUgaGFzaCBkZW1hbmRlZSwgYWxsb3VlZSB1bmUgZm9pcyBwYXIgRW5nMSkuCiAgICBnbG9iYWwgX2luaXRlZCwgRU5HX05BTUUsIEVOR19BVVRIT1IKICAgIGlmIF9pbml0ZWQ6IHJldHVybgogICAgX2luaXRlZCA9IFRydWUKICAgIHIgPSBFbmcxKGN0eF9wdHJbMF0sIGN0eF9wdHJbMV0sIGN0eF9wdHJbMl0sIGN0eF9wdHJbM10sIGN0eF9wdHJbNF0sIEhBU0hfTUIqMTAyNCkKICAgIGxvZyhmIkVuZzEgLT4ge3J9ICAoaGFzaD17SEFTSF9NQn0gTW8pIikKICAgIGlmIHIgIT0gMDoKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGYiRkFUQUw6IEVuZzE9e3J9ICgzPWNvcHktcHJvdGVjdGlvbiA6IHBhdGNoKHMpIENQIGEgY29tcGxldGVyKVxuIik7IHN5cy5leGl0KDEpCiAgICBpZiBFbmcxNTogRW5nMTUoKQogICAgbiA9IChFbmc3KCkgaWYgRW5nNyBlbHNlIGIiIikgb3IgQ0ZHWyduYW1lJ10uZW5jb2RlKCkKICAgIGEgPSAoRW5nNigpIGlmIEVuZzYgZWxzZSBiIiIpIG9yIGIiRnJhbnMgTW9yc2NoIgogICAgRU5HX05BTUUgPSBuLmRlY29kZSgibGF0aW4xIiwgInJlcGxhY2UiKTsgRU5HX0FVVEhPUiA9IGEuZGVjb2RlKCJsYXRpbjEiLCAicmVwbGFjZSIpCiAgICBsb2coZiJwcmV0IDoge0VOR19OQU1FfSAvIHtFTkdfQVVUSE9SfSIpCgpkZWYgc2V0X3BhcmFtcyhkZXB0aCk6CiAgICBzdHJ1Y3QucGFja19pbnRvKCI8aCIsIHNwYXJhbXMsIElURVJERVBUSF9PRkYsIGRlcHRoKQogICAgc3RydWN0LnBhY2tfaW50bygiPGgiLCBzcGFyYW1zLCBNT0RFX09GRiwgTU9ERV9GSVhFRF9ERVBUSCkKICAgIHN0cnVjdC5wYWNrX2ludG8oIjxoIiwgc3BhcmFtcywgQ0FQREVQVEhfT0ZGLCBtaW4oZGVwdGgsIDQ3KSkKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgQm91Y2xlIFVDSQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmJvYXJkID0gQm9hcmQoKTsgYm9hcmQuc2V0X2ZlbihTVEFSVF9GRU4pCgpkZWYgX3NhZmVfc3RvcCgpOgogICAgdHJ5OgogICAgICAgIGlmIEVuZzM6IEVuZzMoKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiBsb2coInN0b3AgRVhDOiIsIHJlcHIoZSkpCgpfc2VhcmNoX3RocmVhZCA9IE5vbmUKCmRlZiBkb19zZWFyY2goZGVwdGg9Tm9uZSwgYnVkZ2V0X21zPU5vbmUpOgogICAgc3QuYmVzdCA9IE5vbmU7IHN0LmRlcHRoID0gMDsgc3Quc2NvcmUgPSAwOyBzdC5zZWFyY2hpbmcgPSBUcnVlOyBzdC50MCA9IHRpbWUudGltZSgpCiAgICBzdC5sYXN0X2VtaXQgPSBOb25lOyBzdC5iZXN0X3B2ID0gTm9uZTsgc3QucmVxX2RlcHRoID0gZGVwdGggb3IgMDsgc3QuYmVzdF9zY29yZV9zZWVuID0gLTIwMDAwMDAwMDA7IHN0LmFyZ21heF9kZXB0aCA9IC0xCiAgICBzdC5ub2RlMCA9IHJlYWRfbm9kZXNfcmF3KCkgaWYgKENGR1snbm9kZSddIGFuZCBDRkcuZ2V0KCdub2RlX2FjY3VtdWxhdGVzJykpIGVsc2UgMAogICAgYm9hcmRfdG9fZW5naW5lKGJvYXJkLCBzcGFyYW1zKQogICAgdGltZXIgPSBOb25lCiAgICBpZiBidWRnZXRfbXMgaXMgbm90IE5vbmU6CiAgICAgICAgc2V0X3BhcmFtcyg0NykKICAgICAgICB0aW1lciA9IHRocmVhZGluZy5UaW1lcihtYXgoYnVkZ2V0X21zLCAxKSAvIDEwMDAuMCwgX3NhZmVfc3RvcCk7IHRpbWVyLnN0YXJ0KCkKICAgICAgICBpZiBDQUxJQjogbG9nKGYic2VhcmNoIGJ1ZGdldD17YnVkZ2V0X21zfW1zIikKICAgIGVsc2U6CiAgICAgICAgc2V0X3BhcmFtcyhkZXB0aCkKICAgICAgICBpZiBDQUxJQjogbG9nKGYic2VhcmNoIGRlcHRoPXtkZXB0aH0iKQogICAgRW5nOShTUCkgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmxvcXVhbnQKICAgIGlmIHRpbWVyOiB0aW1lci5jYW5jZWwoKQogICAgc3Quc2VhcmNoaW5nID0gRmFsc2UKICAgIGVtaXRfaW5mbyhmaW5hbD1UcnVlKQogICAgaWYgbm90IHN0LmJlc3Q6CiAgICAgICAgc3QuYmVzdCA9IHJlYWRfYmVzdF9tb3ZlKCkKICAgIHVjaV9vdXQoZiJiZXN0bW92ZSB7c3QuYmVzdCBpZiBzdC5iZXN0IGVsc2UgJzAwMDAnfSIpCgpkZWYgc3RhcnRfc2VhcmNoKCoqa3cpOgogICAgZ2xvYmFsIF9zZWFyY2hfdGhyZWFkCiAgICBpZiBfc2VhcmNoX3RocmVhZCBhbmQgX3NlYXJjaF90aHJlYWQuaXNfYWxpdmUoKToKICAgICAgICBfc2FmZV9zdG9wKCk7IF9zZWFyY2hfdGhyZWFkLmpvaW4odGltZW91dD0zLjApCiAgICBfc2VhcmNoX3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWRvX3NlYXJjaCwga3dhcmdzPWt3LCBkYWVtb249VHJ1ZSkKICAgIF9zZWFyY2hfdGhyZWFkLnN0YXJ0KCkKCmRlZiBtYWluKCk6CiAgICBnbG9iYWwgYm9hcmQKICAgIGZvciByYXdfbGluZSBpbiBzeXMuc3RkaW46CiAgICAgICAgbGluZSA9IHJhd19saW5lLnN0cmlwKCkKICAgICAgICBpZiBub3QgbGluZTogY29udGludWUKICAgICAgICBsb2coIjw8ICIgKyBsaW5lKTsgdG9rID0gbGluZS5zcGxpdCgpOyBjbWQgPSB0b2tbMF0KICAgICAgICBpZiBjbWQgPT0gInVjaSI6CiAgICAgICAgICAgIHVjaV9vdXQoZiJpZCBuYW1lIHtFTkdfTkFNRX0iKQogICAgICAgICAgICB1Y2lfb3V0KGYiaWQgYXV0aG9yIHtFTkdfQVVUSE9SfSIpCiAgICAgICAgICAgIHVjaV9vdXQoIm9wdGlvbiBuYW1lIEhhc2ggdHlwZSBzcGluIGRlZmF1bHQgNjQgbWluIDEgbWF4IDEwMjQiKQogICAgICAgICAgICB1Y2lfb3V0KCJ1Y2lvayIpCiAgICAgICAgZWxpZiBjbWQgPT0gInNldG9wdGlvbiI6CiAgICAgICAgICAgIGlmICJIYXNoIiBpbiB0b2sgYW5kICJ2YWx1ZSIgaW4gdG9rOgogICAgICAgICAgICAgICAgZ2xvYmFsIEhBU0hfTUIKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBIQVNIX01CID0gbWF4KDEsIG1pbigxMDI0LCBpbnQodG9rW3Rvay5pbmRleCgidmFsdWUiKSsxXSkpKQogICAgICAgICAgICAgICAgICAgIGxvZyhmInNldG9wdGlvbiBIYXNoID0ge0hBU0hfTUJ9IE1vIiArICgiICh0cm9wIHRhcmQgOiBtb3RldXIgZGVqYSBpbml0aWFsaXNlKSIgaWYgX2luaXRlZCBlbHNlICIiKSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246IHBhc3MKICAgICAgICBlbGlmIGNtZCA9PSAiaXNyZWFkeSI6CiAgICAgICAgICAgIGVuc3VyZV9pbml0KCkKICAgICAgICAgICAgdWNpX291dCgicmVhZHlvayIpCiAgICAgICAgZWxpZiBjbWQgPT0gInVjaW5ld2dhbWUiOgogICAgICAgICAgICBlbnN1cmVfaW5pdCgpCiAgICAgICAgICAgIGJvYXJkID0gQm9hcmQoKTsgYm9hcmQuc2V0X2ZlbihTVEFSVF9GRU4pCiAgICAgICAgZWxpZiBjbWQgPT0gInBvc2l0aW9uIjoKICAgICAgICAgICAgZW5zdXJlX2luaXQoKQogICAgICAgICAgICBib2FyZCA9IEJvYXJkKCkKICAgICAgICAgICAgaWYgdG9rWzFdID09ICJzdGFydHBvcyI6CiAgICAgICAgICAgICAgICBib2FyZC5zZXRfZmVuKFNUQVJUX0ZFTikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZlbiA9ICIgIi5qb2luKHRva1syOjhdKSBpZiBsZW4odG9rKSA+PSA4IGVsc2UgIiAiLmpvaW4odG9rWzI6XSkKICAgICAgICAgICAgICAgIGJvYXJkLnNldF9mZW4oZmVuKQogICAgICAgICAgICBpZiAibW92ZXMiIGluIHRvazoKICAgICAgICAgICAgICAgIGZvciBtdiBpbiB0b2tbdG9rLmluZGV4KCJtb3ZlcyIpKzE6XToKICAgICAgICAgICAgICAgICAgICBib2FyZC5hcHBseV91Y2kobXYpCiAgICAgICAgZWxpZiBjbWQgPT0gImdvIjoKICAgICAgICAgICAgZW5zdXJlX2luaXQoKQogICAgICAgICAgICBkZWYgZ3YoaywgZD0wKTogcmV0dXJuIGludCh0b2tbdG9rLmluZGV4KGspKzFdKSBpZiBrIGluIHRvayBlbHNlIGQKICAgICAgICAgICAgaWYgImRlcHRoIiBpbiB0b2s6ICAgICAgICAgICAgICBzdGFydF9zZWFyY2goZGVwdGg9bWluKGd2KCJkZXB0aCIpLCA0NykpCiAgICAgICAgICAgIGVsaWYgIm1vdmV0aW1lIiBpbiB0b2s6ICAgICAgICAgc3RhcnRfc2VhcmNoKGJ1ZGdldF9tcz1ndigibW92ZXRpbWUiKSkKICAgICAgICAgICAgZWxpZiAiaW5maW5pdGUiIGluIHRvazogICAgICAgICBzdGFydF9zZWFyY2goZGVwdGg9NDcpCiAgICAgICAgICAgIGVsaWYgInd0aW1lIiBpbiB0b2sgb3IgImJ0aW1lIiBpbiB0b2s6CiAgICAgICAgICAgICAgICBtdCwgbWkgPSAoZ3YoInd0aW1lIiksIGd2KCJ3aW5jIikpIGlmIGJvYXJkLndoaXRlIGVsc2UgKGd2KCJidGltZSIpLCBndigiYmluYyIpKQogICAgICAgICAgICAgICAgc3RhcnRfc2VhcmNoKGJ1ZGdldF9tcz1tYXgoMTAsIG10IC8vIDMwICsgbWkpKQogICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3NlYXJjaChkZXB0aD0xMikKICAgICAgICBlbGlmIGNtZCA9PSAic3RvcCI6CiAgICAgICAgICAgIF9zYWZlX3N0b3AoKQogICAgICAgIGVsaWYgY21kID09ICJxdWl0IjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgX3NhZmVfc3RvcCgpCiAgICAgICAgICAgICAgICBpZiBFbmcyOiBFbmcyKCkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogcGFzcwogICAgICAgICAgICBicmVhawoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHRyeTogbWFpbigpCiAgICBmaW5hbGx5OiBfbG9nZi5jbG9zZSgpCg==\";\n    var btn=document.getElementById('dl-btn');\n    btn.addEventListener('click',function(){\n      var bin=atob(B64), arr=new Uint8Array(bin.length);\n      for(var i=0;i<bin.length;i++) arr[i]=bin.charCodeAt(i);\n      var blob=new Blob([arr],{type:'text\/x-python'});\n      var url=URL.createObjectURL(blob), a=document.createElement('a');\n      a.href=url; a.download='eng2uci.py';\n      document.body.appendChild(a); a.click(); document.body.removeChild(a);\n      URL.revokeObjectURL(url);\n    });\n  })();\n<\/script>\n<\/body>\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Faire rejouer les vieux Fritz \u2014 le pont eng2uci Laboratoire \u00b7 moteurs d&#8217;\u00e9checs classiques Faire rejouer les vieux Fritz Les Fritz d&#8217;autrefois \u2014 de la 5.32 (1997) \u00e0 la 9 (2005) \u2014 sont enferm\u00e9s dans le logiciel ChessBase qui les a vus na\u00eetre. Un petit pont les lib\u00e8re : il les fait passer pour des&hellip;&nbsp;<a href=\"https:\/\/www.chess.lumn.eu\/wordpress\/2026\/07\/10\/fritz-sous-gui-alternatives\/\" class=\"\" rel=\"bookmark\">Read More &raquo;<span class=\"screen-reader-text\">Fritz sous GUI alternatives<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":""},"categories":[53],"tags":[],"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"valterd","author_link":"https:\/\/www.chess.lumn.eu\/wordpress\/author\/valterd\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/www.chess.lumn.eu\/wordpress\/category\/blog\/\" rel=\"category tag\">Blog<\/a>","rttpg_excerpt":"Faire rejouer les vieux Fritz \u2014 le pont eng2uci Laboratoire \u00b7 moteurs d&#8217;\u00e9checs classiques Faire rejouer les vieux Fritz Les Fritz d&#8217;autrefois \u2014 de la 5.32 (1997) \u00e0 la 9 (2005) \u2014 sont enferm\u00e9s dans le logiciel ChessBase qui les a vus na\u00eetre. Un petit pont les lib\u00e8re : il les fait passer pour des&hellip;&nbsp;Read&hellip;","_links":{"self":[{"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/posts\/3964"}],"collection":[{"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=3964"}],"version-history":[{"count":5,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/posts\/3964\/revisions"}],"predecessor-version":[{"id":3971,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/posts\/3964\/revisions\/3971"}],"wp:attachment":[{"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=3964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=3964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.chess.lumn.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=3964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}